はじめまして。
VC初心者です。
あるスレッドの処理に対して、
100msec毎にタイマー割り込みをかけ、
タイマー割り込み処理が終了したら、
また続きの処理に戻るという処理を作成したいのですが、
可能でしょうか。
いろいろ調べてはみたのですが、全く分かりませんでした。
よろしくお願いします。
開発環境:WindowsNT、VC++6.0
SetTimerを調べてみてください。
いくつか注意事項を。
Windowsのタイマーは基本的にあてになりません。
正確に100msecで割り込みたいという用途には向いていないと思いますよ。
また、スレッド内に割り込みを検知する仕掛けを用意していないと
スレッドは回りっぱなしになりますよね。
ウインドウを持っていないとSetTimerはかけられませんから
ワーカースレッドではかけられません。
ウインドウを持っているメインスレッドでかけて、ワーカースレッドに通知する。
ワーカースレッドは通知を検知して別の処理をするといった工夫が必要でしょう。
あと、割り込みで行う処理が100ms以上かかってしまうとタイマー通知がきても
溜まったイベントは一つにまとめられてしまうので、期待した回数分来ない可能性も
あります。この辺はよく考えてしくみを組み立てられた方がよいと思います。
PATIOさんへ
ちょっと突っ込みです・・
>ウインドウを持っていないとSetTimerはかけられませんから
>ワーカースレッドではかけられません。
この記述は、間違いです
CWnd::SetTimerでは、使えませんが
::SetTimerで、どのウィンドウにも関連付けられていないタイマを作成する事ができます。
みなさん、ありがとうございます。
やりたい事は下記のような感じです。
--------------------
スレッドA (CWinThread)
(処理1) [タイマー割込み処理]
… → (処理2)
… ← …
…
--------------------
WM_TIMER は使えないようだったので、
下記のように、コールバック関数なるものでやろうとしました。
ですが、TimerProcの処理に入ってきません。
全く的外れだったらすみません。
どうしてでしょうか。
static void CALLBACK EXPORT TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD
dwTime)
{
(処理2)
return;
}
SetTimer(NULL,50,100,TimerProc);
while(…){
(処理1)
}
自分はこうしてます。
多分問題ないと思ってますが。
SetTimer(NULL,50,100,TimerProc);
while(…){
MSG msg;
while(::PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
(処理1)
}
何をやっているかと言うと、WM_TIMER 等のメッセージを処理するようにしています。
単に Sleep() でもよいのかもしれませんが。
んさん、ありがとうございました。
上記で、TimerProcの処理に入るようになったのですが、
(処理1)に入ると、その処理が終るまでタイマー割込み処理に入る事ができません。
(処理1)の途中でも、イベントがたったらタイマー割込み処理に入って、
割込み処理が終ったら、中断した(処理1)の続きに戻るという事はできないでしょうか。
よろしくお願いします。
> 割込み処理が終ったら、中断した(処理1)の続きに戻るという事はできないでしょうか。
(処理1)の中に PeekMessage 等の処理を入れるしかないです。
その処理を入れる隙間がない(他の処理を呼んでいてその処理に時間がかかる等)ので
あれば、タイマー処理は別スレッドにするしかないと思います。
他に有効な手立てがあれば、私も知りたいですね。
Windowsでは、割り込み処理ルーチンはかけないのでは?
#できるなら、その方法を私もぜひ知りたいです。(^^;
> 割込み処理が終ったら、中断した(処理1)の続きに戻るという事はできないでしょうか。
タイマーをメインスレッド側で作成します。
タイマー処理中に(処理1)のスレッドを止めたいのであれば、
SuspendThreadとResumeThreadを使用すればよいと思います。