割り込み処理 – プログラミング – Home

通知
すべてクリア

割り込み処理


eee
 eee
(@eee)
ゲスト
結合: 23年前
投稿: 6
Topic starter  

はじめまして。
VC初心者です。

あるスレッドの処理に対して、
100msec毎にタイマー割り込みをかけ、
タイマー割り込み処理が終了したら、
また続きの処理に戻るという処理を作成したいのですが、
可能でしょうか。

いろいろ調べてはみたのですが、全く分かりませんでした。
よろしくお願いします。

開発環境:WindowsNT、VC++6.0


引用解決済
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

SetTimerを調べてみてください。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

いくつか注意事項を。
Windowsのタイマーは基本的にあてになりません。
正確に100msecで割り込みたいという用途には向いていないと思いますよ。
また、スレッド内に割り込みを検知する仕掛けを用意していないと
スレッドは回りっぱなしになりますよね。
ウインドウを持っていないとSetTimerはかけられませんから
ワーカースレッドではかけられません。
ウインドウを持っているメインスレッドでかけて、ワーカースレッドに通知する。
ワーカースレッドは通知を検知して別の処理をするといった工夫が必要でしょう。
あと、割り込みで行う処理が100ms以上かかってしまうとタイマー通知がきても
溜まったイベントは一つにまとめられてしまうので、期待した回数分来ない可能性も
あります。この辺はよく考えてしくみを組み立てられた方がよいと思います。


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 80
 

PATIOさんへ
ちょっと突っ込みです・・
>ウインドウを持っていないとSetTimerはかけられませんから
>ワーカースレッドではかけられません。
この記述は、間違いです
CWnd::SetTimerでは、使えませんが
::SetTimerで、どのウィンドウにも関連付けられていないタイマを作成する事ができます。


返信引用
eee
 eee
(@eee)
ゲスト
結合: 23年前
投稿: 6
Topic starter  

みなさん、ありがとうございます。
やりたい事は下記のような感じです。

--------------------
スレッド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)
}


返信引用
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 81
 

自分はこうしてます。
多分問題ないと思ってますが。

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() でもよいのかもしれませんが。


返信引用
eee
 eee
(@eee)
ゲスト
結合: 23年前
投稿: 6
Topic starter  

んさん、ありがとうございました。

上記で、TimerProcの処理に入るようになったのですが、
(処理1)に入ると、その処理が終るまでタイマー割込み処理に入る事ができません。
(処理1)の途中でも、イベントがたったらタイマー割込み処理に入って、
割込み処理が終ったら、中断した(処理1)の続きに戻るという事はできないでしょうか。

よろしくお願いします。


返信引用
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 81
 

> 割込み処理が終ったら、中断した(処理1)の続きに戻るという事はできないでしょうか。

(処理1)の中に PeekMessage 等の処理を入れるしかないです。
その処理を入れる隙間がない(他の処理を呼んでいてその処理に時間がかかる等)ので
あれば、タイマー処理は別スレッドにするしかないと思います。

他に有効な手立てがあれば、私も知りたいですね。


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

Windowsでは、割り込み処理ルーチンはかけないのでは?

#できるなら、その方法を私もぜひ知りたいです。(^^;


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> 割込み処理が終ったら、中断した(処理1)の続きに戻るという事はできないでしょうか。

タイマーをメインスレッド側で作成します。
タイマー処理中に(処理1)のスレッドを止めたいのであれば、
SuspendThreadとResumeThreadを使用すればよいと思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました