自作関数 setInterval と WM_TIMER について。
C/C++ ( WindowsAPI 実装 ) でやっています。
JavaScriptでいう setInterval関数 のようなものってないでしょうか。
"Stack Overflow" というサイトでは、
C++11 の thread を使う方法が掲載されています。
CUIで試したところ、うまくいったのですが、
GUI で試したところ、クラッシュしてうまくいきませんでした。
C++
1typedef bool (*INTERVALTHREAD)(); 2 3 4void setInterval(INTERVALTHREAD function,int interval) { 5 thread th([&]() { 6 while(true) { 7 std::this_thread::sleep_for(std::chrono::milliseconds(interval)); 8 if( function() != true ) break; 9 } 10 }); 11 th.detach(); 12} 13 14// グローバル変数。 別のスレッド ( ウィンドウプロシージャ等 ) から "終了命令" を下すため。 15int a; 16 17bool func(){ 18 a++; 19 if( a <= 4 ){ 20 printf( "OK\n" ); 21 return true; 22 }else{ 23 return false; 24 } 25} 26 27
を GUI に埋めこんでみましたが、クラッシュしました。
WindowsAPI の SetTimer関数 と WM_TIMER で処理するのはいいのですが、
「Win32 API入門」(http://wisdom.sakura.ne.jp/system/winapi/)
->「標準 Windows API」の
->「タイマー」
には、
『さらに、タイマーは 1000 ミリ秒に設定したからといって
必ず1秒後に WM_TIMER が実行されるとは限りません
WM_TIMER が発生した時、他のメッセージが処理中であれば
その間 WM_TIMER はキューの中で実行を待つことになります
また、コールバック関数を使って指定関数を呼び出すことも可能です
この場合は、指定時間が経過するとWindowsが関数を呼び出します...』
とあります。
他のサイト ( どこだったか忘れましたが。 ) でも
ウィンドウプロシージャにキューされるが、(その他の)処理内容が多い場合、指定間隔よりも長くなる可能性がある。
といった感じの文がありました。
今のところ (その他の)処理が多い プログラムが思いつかないのですが、
(他の)処理のために指定間隔がずれるのを防ぐ方法はないのでしょうか。
WinAPI の SetTimer関数 で指定する コールバック関数を 定義すれば回避できるのでしょうか。
それとも他にやり方があるのでしょうか。
[環境等]
言語 : C/C++ ( WinAPI 実装 )
コンパイラ: MinGW
宜しくお願い致します。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。