スレッドの 1 つでしばらく待つ必要があります。考え始めましたWaitForSingleObject
が、タイムアウト入力が必要になる可能性がありますが、待機するにはハンドルが必要です。
別の解決策が使用される可能性がありますが、メッセージがSetTimer
作成されるようWM_TIMER
ですが、スレッドにいるため、そのメッセージをキャッチする変更がありません。ここで使用できるものはありますか? 使えますSleep
か?
スレッドの 1 つでしばらく待つ必要があります。考え始めましたWaitForSingleObject
が、タイムアウト入力が必要になる可能性がありますが、待機するにはハンドルが必要です。
別の解決策が使用される可能性がありますが、メッセージがSetTimer
作成されるようWM_TIMER
ですが、スレッドにいるため、そのメッセージをキャッチする変更がありません。ここで使用できるものはありますか? 使えますSleep
か?
WM_TIMER はあまり信頼できません。これは優先度の低い Windows メッセージであり、ユーザーがウィンドウのサイズを変更している場合 (たとえば) は送信されません。
「スリープ」が最適なオプションだと思いますが、必要に応じて待機操作をキャンセルするハンドルを渡すことができるため、以前は WaitForSingleObject を使用していました。あなたのデザインに依存します。
適切な方法は、 の意味によって大きく異なりますto wait some time
。Sleep 関数とWaitForSingleObject 関数は基本的に同じ精度です。基盤となるハードウェアと OS のバージョンに応じて、達成可能な最小遅延は 0 .. 1 .. 20ms の範囲になります。数秒または 10 秒だけ待機する場合は、これら 2 つの関数が適切な選択です。
より短い時間、つまりミリ秒の範囲で待機する場合は、より詳細な調査が必要です。詳細については、この回答またはこの回答を参照してください。
スレッドを一定時間待機させたいだけの場合は、Sleep()
そのために使用します。しかし、何らかの外部操作によって待機を中断可能にしたい場合は、タイマー (SetTimer()
およびを参照Get/PeekMessage()
)、イベント (CreateEvent()
およびを参照WaitForSingleObject()
)、スレッドのキュー内のメッセージ(PostThreadMessage()
およびを参照)、何かを待機する必要がありますMsgWaitForMultipleObjects()
。 I/O 完了ポートのコールバック (PostQueuedCompletionStatus()
およびを参照GetQueuedCompletionStatus()
) など。
スレッドをブロックして特定の時間まで待機する場合は、CreateWaitableTimer()
関数を使用WaitForSingleObject()
してから、タイマー ハンドルで使用できます。
この関数は、特定の期間待機することもできWaitForMultipleObjects()
、タイマー間隔と他のオブジェクトを同時にブロックすることができます。