VB6Timer
コントロールは、起動時に別の処理スレッドを作成しますか?
2 に答える
VB6 タイマー コントロールは、バックグラウンド スレッドで実行されるある種のビジー待機ループではありません。彼らは実際にはまったく「実行」していません。
Enabled = True を設定したとき (または Interval が 0 の場合は Interval を変更したとき) にわかる限り、コントロールは SetTimer() 呼び出しを行います。Enabled = False を設定すると (または Interval を 0 に設定すると)、KillTimer() 呼び出しが行われます。
通常の VB6 メッセージ ループ (もちろん UI スレッドで実行されます) は、受信した WM_TIMER メッセージを関連するタイマーのイベント ハンドラー コードにディスパッチすることによって処理します。したがって、イベント ハンドラー内のコードは UI スレッドで実行され、終了するまでそれ以降のメッセージ処理がブロックされます。間隔が符号なしの 16 ビット値に切り刻まれているようです - 従来の理由 (16 ビット VB および Windows) のためですか?
プログラムでコーディングされたビジー待機ループのようなもの (すべてのコードが UI スレッドで実行される) は、もちろんメッセージ処理をブロックし、タイマーが "起動" しないという錯覚を与えます。WM_TIMER は優先度の低いメッセージであるため、UI スレッドがバインドされている間、メッセージ キューに深く積み上げられることはありません。
WM_TIMER メッセージは優先度の低いメッセージです。GetMessage 関数と PeekMessage 関数は、スレッドのメッセージ キューに優先度の高いメッセージが他にない場合にのみ、このメッセージを送信します。
いいえ、タイマーはウィンドウプロシージャと同じスレッドで実行されるため、VisualBasic6プログラムで実行されます。これは、プロセッサを集中的に使用する操作を行う場合、処理されているWM_TIMERメッセージに依存できないことを意味します。