VCでウエイトをミリ秒単位でかけられるんですが、μ秒でのやり方わかりません。

Sleep(); や タイマーでウエイトをミリ秒単位でかけられます。
どうしても、μ秒でウエイトをかけて、CPUを軽くしたいのです。
μ秒単位のウエイトのかけ方を教えてください。

理由:whileでずっと、ある処理を続けていたいのですが、CPUが100%にいってしまい。他のアプリが重いです。かといって、ミリ秒単位ででウエイトをかけても、処理の方に問題がでてしまいます。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

μ秒オーダーで処理を OS に戻すやり方は


分かりませんが、
永久ループしている中で何回かに1回 Sleep(1)
するのも手ですよ。
    • good
    • 0

Perntium以降のCPUに限りますが・・・


QueryPerformanceCounter()
QueryPerformanceFurequency()
にてCPUのクロックカウントを取得できます
これを使えばマイクロ秒単位でも計測は出来ます・・・が
理由を見る限りではこの方法でどうこうするよりも構造を見直すか、マルチスレッド化したりするほうが上手くいくと思いますよ

QueryPerformanceCounter()
http://www.microsoft.com/japan/developer/library …

QueryPerfonmanceFrequency()
http://www.microsoft.com/japan/developer/library …
    • good
    • 0

 もし、正確な間隔が必要ないなら



 sleep(0);

 を試してみてはいかがでしょう。
 CPU使用率は100%近くになりますが、他のアプリはそれほど重く
ないと思います。
    • good
    • 0

基本的にWindowsのAPIの類ではマイクロ秒単位で


Sleepさせることはできなかったはず・・・

どうしてもというのであれば、C言語でサポート
していたと思うので、そちらを探してください。

それと、while文でずっと処理を回し続ければ、
当たり前ですが、やたらとCPUの処理を占有すると
思います。どうせGUIを持つのでしょうから、
タイマーをはってはどうでしょうか?CUIのものの
場合は、見せないWindowを作れば、同じような
動作が可能になるはずです。

タイマーが切れたら処理をして、一度終わったら
また数ミリ秒待たせる・・・
これではダメですか?

どのような処理をさせたいのか分かりませんが、
ある程度のものならば、これで対処できると思います。

ダメなときは補足してください。
ではでは☆
    • good
    • 0

これは、μ秒でやってもCPU負荷は100%になりますよ。


Windowsプログラムは、OSを含むプロセス間でメッセージ等の
通信をしていますので、あるプログラムがこのプロセス通信を遮断すると、
他のアプリの通信が途絶えます。よって、他のアプリが重くなるのです。
くわしくは、OSはそれぞれのプログラムが何をやってるかわかりませんから、
容赦なく全てのプログラムにメッセージを送ってきます。
プログラムは、そのメッセージが必要なければ、必要ない旨をOSに
知らせなくてはなりません。whileループでこの処理を行っていない場合、
OSはタイムアウトまで待ちつづけることになり、他のプログラムに
メッセージを送れません。当然、本来そのメッセージが必要なプログラム側
からすれば、メッセージがこないわけですから動くことが出来ません。

ある処理を続けたいのならば、その処理をスレッド処理をするか、
その処理内部でメッセージ処理をするようにしましょう。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました(^0^)

またよろしくお願いします

お礼日時:2001/01/26 12:17

μ秒単位ウェイトは無理です。


 ミリ秒単位が限界です。1/16秒が限界で、それ以下にしても、期待したスペックは出ません。

 重い処理の場合には、スレッドにするのが一般的で、それならばスレッドの優先度等を設定すれば、CPUが100%にならずに使用出来ます(まぁ設計の問題があれば別ですが...ね)
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました(^0^)

またよろしくお願いします

お礼日時:2001/01/26 12:17

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QSleepを使って処理を一時停止させたいのですが・・・

現在VisualStudio.NET2003でC++のプログラムからブラウザを呼び出すプログラムを作っているのですが、他の関数のところでSleep関数を使って処理を一定時間停止させたいのですが、エラーがでてうまくいきません。Sleepを使わずにインクルードからwindows.hを外せばビルドできるのですが・・・。どうしてもSleepを使わなければいけないので。

どのように解決したらよいのでしょうか?

エラーの内容は以下の通りです。
error C2039: 'MessageBoxA' : 'System::Windows::Forms' のメンバではありません。
error C3861: 'Show': 識別子は、引数依存の照合を使用しても見つかりません。
error C2653: 'MessageBoxA' : 識別子がクラス名でも名前空間名でもありません。
error C3861: 'Show': 識別子は、引数依存の照合を使用しても見つかりません。
とでます。

以下にエラーが出ている箇所のソースをのせます。

int call_browser(){
System::String * target= "http://www.microsoft.com";
try
{
System::Diagnostics::Process::Start(target);
}
catch (System::ComponentModel::Win32Exception * noBrowser)
{
if (noBrowser->ErrorCode==-2147467259)
System::Windows::Forms::MessageBox::Show(noBrowser->Message); // エラー!!
}
catch (System::Exception * other)
{
System::Windows::Forms::MessageBox::Show(other->Message); // エラー!!

}
return 0;
}

現在VisualStudio.NET2003でC++のプログラムからブラウザを呼び出すプログラムを作っているのですが、他の関数のところでSleep関数を使って処理を一定時間停止させたいのですが、エラーがでてうまくいきません。Sleepを使わずにインクルードからwindows.hを外せばビルドできるのですが・・・。どうしてもSleepを使わなければいけないので。

どのように解決したらよいのでしょうか?

エラーの内容は以下の通りです。
error C2039: 'MessageBoxA' : 'System::Windows::Forms' のメンバではありません。
erro...続きを読む

Aベストアンサー

SleepってWIN32 APIのSleepを使おうとしているのでしょうか?

.NETでの開発なら Thread::Sleep() を使用すればいいのでは?

Qログ出力でミリ秒まで出したいのですが・・・

Keil社のMDK-ARMというソフトウェアを使用してコーディングを行っているのですが、ログ出力で現在日付時刻を出力しようとした際、ミリ秒まで出せなくて困っています。

VCで同様のコーディングを行った際はGetLocaltimeが使えたので問題なかったのですが、こちらではWindows APIが使えないためGetlocaltimeが使えず今に至ります。
一応マニュアルやweb検索で何かないか探しているのですが今のところ使えそうな関数は見つかっていません。

知っている方、良ければ教えてくださいお願いします。

ちなみに開発環境のOSはWindows XPですが、動作OSは NORTi professional(μITRON4.0)を想定しています。

Aベストアンサー

サービスコールのget_timを使えば、ある程度精度の高い時刻を取得できると思います。
ただし、SISTIME型がどんな単位の値になるかは、isig_timeを呼び出す周期にかかわっているので、環境に依存します。

なお、get_timで得られるシステム時刻は暦時間ではありませんので、年月日時分秒を取得したいのであれば、RTCから得た暦時間と合わせて使用する必要があるかと思います。

QC# 2010 pageSetupDialogの余白単位の表示 ミリと

C# 2010 pageSetupDialogの余白単位の表示 ミリとインチの切替に関して
pageSetupDialogの右下に余白サイズが表示されます
上下左右の余白がグループ化され上部に 余白(ミリ) とのキャプションが付きます (1)
余白の単位をインチに指定変えしても 余白(インチ) になりません (2)
どのようにすれば単位表示を切り替えることが可能でしょうか?
宜しくご指導お願い申しあげます
private void button1_Click(object sender, EventArgs e)
{
this.pageSetupDialog1.Document = this.printDocument1;

this.pageSetupDialog1.EnableMetric = false; //ミリ指定
pageSetupDialog1.ShowDialog(); (1)

this.pageSetupDialog1.EnableMetric = true; //インチ指定
pageSetupDialog1.ShowDialog(); (2)
}

C# 2010 pageSetupDialogの余白単位の表示 ミリとインチの切替に関して
pageSetupDialogの右下に余白サイズが表示されます
上下左右の余白がグループ化され上部に 余白(ミリ) とのキャプションが付きます (1)
余白の単位をインチに指定変えしても 余白(インチ) になりません (2)
どのようにすれば単位表示を切り替えることが可能でしょうか?
宜しくご指導お願い申しあげます
private void button1_Click(object sender, EventArgs e)
{
this.pageSetupDialog1.Document = this.printDocument1;

this...続きを読む

Aベストアンサー

出来る方法は コントロールパネルの地域設定を 米国などに変更してやると
『余白(インチ)』になるようです

ちなみに System.Threading.Thread.CurrentCultureや System.Threading.Thread.CurrentUICultureを変更してもココには影響ないようでした

コードから変更出来る方法は探しきれていません … m(__)m

Q【MFC】sleep関数を用いたモーダルダイアログを閉じる処理の実装方法

開発環境はVC++2005のMFCです。

Ctest dlg;
dlg.DoModal();

にて呼出したダイアログを、sleep関数で一定の時間経過後に
自動で閉じる処理を実装したいのですが、どのように実装すれば良いでしょうか?
またsleep関数でなく、他の時間を計る関数を用いたものでも良いので、
もしご存知の方おられましたら、ご教授お願い致します。

Aベストアンサー

Sleep()による実装はUIとしてはお勧めできません。反応が鈍くなるからです。
No.1さんのようにタイマーで代替するわけですが、ダイアログ側に実装したほうが、
使い勝手が良くなると思います。
(面倒なことはクラスで隠ぺいしちゃいましょ。それがC++流)

// ダイアログ用ヘッダ

// CTestDialog ダイアログ

class CTestDialog : public CDialog
{
DECLARE_DYNAMIC(CTestDialog)

public:
CTestDialog(CWnd* pParent = NULL); // 標準コンストラクタ
virtual ~CTestDialog();

// ダイアログ データ
enum { IDD = IDD_TEST };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート

// タイマー用識別子(Windowsによって返された値)
UINT m_TimerID;

DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
afx_msg void OnTimer(UINT_PTR nIDEvent);
};

// ダイアログ 実装(cpp)

// TestDialog.cpp : 実装ファイル
//

#include "stdafx.h"
#include "test.h"
#include "TestDialog.h"


// CTestDialog ダイアログ

IMPLEMENT_DYNAMIC(CTestDialog, CDialog)

CTestDialog::CTestDialog(CWnd* pParent /*=NULL*/)
: CDialog(CTestDialog::IDD, pParent)
{

}

CTestDialog::~CTestDialog()
{
}

void CTestDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CTestDialog, CDialog)
ON_WM_TIMER()
END_MESSAGE_MAP()


// CTestDialog メッセージ ハンドラ

BOOL CTestDialog::OnInitDialog()
{
CDialog::OnInitDialog();

// タイマーを設定します。
// タイマーIDの希望値を1とします
// ここでは5秒後に通知させるものとします。
// ダイアログを表示させておきたい時間に合わせて調整してください。
m_TimerID = SetTimer(1, 5*1000, NULL);

return TRUE; // return TRUE unless you set the focus to a control
// 例外 : OCX プロパティ ページは必ず FALSE を返します。
}

void CTestDialog::OnTimer(UINT_PTR nIDEvent)
{
// タイマーメッセージ応答関数です
// 本ダイアログではタイマーを一つしか使っていないので
// IDの確認はなくても動作します。
// 複数のタイマーを使用できます。
// どのタイマーかはnIDEventで区別します。

if (nIDEvent == m_TimerID)
{
// ダイアログを消します
// EndDialog()のパラメータがそのままDoModal()の戻り値となります。
// 本プログラムではDoModal()の戻り値を利用していないので
// なんでもかまいません。
// 一応、OKを押した場合と区別可能なようにIDCANCELとしました。
// 無論IDOKでも支障ありません。

EndDialog(IDCANCEL);
}

CDialog::OnTimer(nIDEvent);
}

Sleep()による実装はUIとしてはお勧めできません。反応が鈍くなるからです。
No.1さんのようにタイマーで代替するわけですが、ダイアログ側に実装したほうが、
使い勝手が良くなると思います。
(面倒なことはクラスで隠ぺいしちゃいましょ。それがC++流)

// ダイアログ用ヘッダ

// CTestDialog ダイアログ

class CTestDialog : public CDialog
{
DECLARE_DYNAMIC(CTestDialog)

public:
CTestDialog(CWnd* pParent = NULL); // 標準コンストラクタ
virtual ~CTestDialog();

// ダイア...続きを読む

QLinaxのC言語で100ミリ秒スリープさせたいのですが、どのような方法が良いでしょうか?

LinaxのC言語で100ミリ秒スリープさせたいのですが、どのような方法が良いでしょうか?

よろしくお願いします

Aベストアンサー

こんにちわ。

Linux であれば、usleep が使えると思います。
参考URL を確認して見て下さい。

マイクロ秒単位でパラメータを指定しますが、ミリ秒以下はあまりアテに
ならないと思います。

参考URL:http://members.tripod.co.jp/shiroikumo/linux/time/usleep.html


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報