引数で渡した値だけ待つ関数を作っているのですが、うまくいきません。
OS:WindowsXP Professional (SP1)
プラットホーム:Visual C++ Ver7
アプリケーション:コンソールタイプ
失敗例1:Sleep()関数を用いた。
結果:15msec以下の設定が出来なかった。
(1/64secの整数倍でないとズレが生じた)
失敗例2:Clock()関数を使って以下のルーチンを作成
void WaitTimer( clock_t wait )
{
register clock_t goal;
goal = clock() + wait;
while( goal > clock());
}
結果:失敗例1と同じ結果。
どうやら(スレッドか何かはわかりませんが)64Hz周期の何かがあるようです。
何方か10msec単位(±1msec)のWaitTimerを作ったことがある方、是非ノウハウを教えてください!
No.3ベストアンサー
- 回答日時:
既に2の方が回答されていますが
QueryPerformanceCounterとQueryPerformanceFrequencyが
最も高い時間精度を持つ測定用のAPIです。
(GetTickCount等に比べると1回の処理自体は重いです。)
http://homepage1.nifty.com/aok2/04oldpage/win01. …
あと少しでもパフォーマンスをよくするなら
inline展開してはどうでしょう。
inline void WaitTimer( DWORD wait )
{
(略)
}
QueryPerformanceCounter自体にも処理がかかるので
事前にそれらの処理にかかる時間を計算しておき
その値を差し引くとより厳密になるかもしれません。
http://www14.big.or.jp/~ken1/tech/tech19.html
参考URL:http://homepage1.nifty.com/aok2/04oldpage/win01.html,http://www14.big.or.jp/~ken1/tech/tech19.html
この回答への補足
以下のような関数を作って14.3msec(70Hz)で動作させて見ました。
Xeon 2.8GHzのパソコンの場合、変動幅0.5msecで動作しています。(外部出力をオシロで計測)
//-----------------------------------------------
// Nameint WaitMillisec( int wait )
// Parameter(s)wait:Wait time(msec)
// Return void
// Description
//-----------------------------------------------
int WaitMillisec( int wait )
{
int r, ret;
register LONGLONG goal, freq, cnt;
r = QueryPerformanceFrequency( (LARGE_INTEGER *)&freq );
if( r == 0 ){
ret = V_Error;
}
else{
QueryPerformanceCounter( (LARGE_INTEGER *)&goal );
goal += freq * (LONGLONG)wait /1000;
ret = V_Ok;
do{
QueryPerformanceCounter( (LARGE_INTEGER *)&cnt );
}while(goal>cnt);
}
return(ret);
}
早速inline展開を試してみましたが、効果はありませんでした。
次にQueryPerformanceCounter関数を使ったところ、予想以上に上手くいっています。
有難うございました。
No.4
- 回答日時:
まず、通常のWindowsはms単位での時間精度は確保できないOSであることを覚えておいてください。
それとマルチスレッドで同時に複数動いてますから、他によりプライオリティの高いスレッドが動作すると待たされるということも。(例えば通常のスレッドはマウスの移動で待ちが発生する)
また、スレッドのスイッチ等は確か10msか1msの単位です。
Sleepはスレッドのスイッチになりますから、この時間以下の精度は出せません。
時間の計測ならQueryPerformanceCounter等で高精度にできますが、msecの精度で処理をさせるのは多種のテクニックを使ってもあまり高精度にはできません。
通常はリアルタイム処理可能なOSを使うとか、Windowsならリアルタイム処理をさせるためのソフトを組み込む等になります。
管理者特権でリアルタイムプライオリティを使うとある程度改善します。
また、某所の仕事で時間精度を要求される時には拡張ボードでハードウェアによるタイマ割り込みを使い
精度を得てました。
この回答への補足
アドバイス有難うございました。
私も元は組込み用ソフトの開発者ですのでスレッドは気にしていたのですが、今回の制御は100Hz以下の周期であまり精度も求めていなかったので、速いPCならスレッドの影響を受けないだろうという考えがそもそも間違えでした。
f^_^;10msec以上のぶつ切りスレッドとは思いませんでした。
やはり定石どおり、今後は速い制御についてはハードを組みます。
No.1
- 回答日時:
ここら辺に参考になるのがあるかも
http://www.cybernet.co.jp/matlab/support/helpdes …TICカウンタ使ったり、base clkとcpu倍率とって周波数測定したり、ですかね
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- 物理学 2次の伝達関数のゲイン線図についてです。 ゲイン線図を直線近似した時に、傾きが0dB/secから-2 2 2022/07/10 19:31
- C言語・C++・C# win10で、正確な待ち時間の作り方 6 2023/02/14 18:28
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Access(アクセス) Access クエリ 同一テーブル内 複数フィールドの同時集計のやり方について 1 2022/05/18 19:01
- Excel(エクセル) Excel-VBAの「しばらくお待ちください」のダイアログが自動的に閉じない 2 2023/05/24 15:31
- 英語 The clock was break.と、The clock broken.の違いと、使い分け方を 2 2023/08/23 19:32
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- その他(スマホアプリ・スマホゲーム) アラームが鳴るじゃないですか? あれ何秒間かとか、ワンコーラス流れたら勝手にストップするアプリありま 2 2023/08/26 22:33
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
同一スレッドで、ロックをかけ...
-
スレッドの監視方法について
-
VC++スレッドの正しい終了のさ...
-
Windows上で、シグナル(SIGTERM...
-
MFCマルチスレッドについて
-
Win32APIでのスレッド処理
-
CWnd::OnTimerのスレッドの取得
-
他のAppのIMEを終了させるには
-
volatile の使い方
-
.NetのBackgroundWorkerクラス...
-
Linuxでスレッド優先度って変え...
-
VB2005 シリアル通信のClose処理
-
マルチスレッド:スレッドの終...
-
msec単位のWait Timerが作れない!
-
マルチスレッドについて
-
LinuxでDoEvents()同等機能
-
スレッドについて
-
Macターミナルで実行中のプログ...
-
バックグラウンドのプロセスの...
-
緯度、経度の 10進法と 60進法...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
VC++スレッドの正しい終了のさ...
-
スレッドの監視方法について
-
スレッドの安全な終了のさせ方
-
Windows上で、シグナル(SIGTERM...
-
マルチスレッドプログラミング...
-
スレッドの終了の仕方
-
スレッドにて同一メモリの書き...
-
VB2005 シリアル通信のClose処理
-
スレッドの終了はどうやるんで...
-
スレッドでWM_TIMERを受け取れない
-
同一スレッドで、ロックをかけ...
-
マルチスレッドのスレッド数を...
-
WaitForMultipleObjectのイベン...
-
MFC通信プログラムマルチスレッ...
-
pthread_cond_wait 取りこぼし?
-
【VC++6.0(MFC)】スレッドの呼...
-
待機関数(WaitForMultipleObjec...
-
LinuxでDoEvents()同等機能
-
CWnd::OnTimerのスレッドの取得
おすすめ情報