2011-11-13 24 views
1

Windowsアプリケーションのメッセージループでは、GetMessage()関数はメッセージキューにメッセージがないときにアプリケーションスレッドを一時停止しますが、メッセージキューにメッセージがエンキューされたときにどのように起動するのですか?スリープスレッドはどうやって目を覚ますことができますか?Win32 APIのGetMessage()の内部メカニズムは?

while (GetMessage (&msg, NULL, 0, 0)) 
     { 
       TranslateMessage (&msg) ; 
       DispatchMessage (&msg) ; 
     } 

答えて

1

通常の非同期待機スレッドが待機する方法(WaitForSingleObjectを使用)と同じ方法で待機します。内部的に(カーネルレベルで)、カーネルAPI関数を使用して待ちます。KeWaitForSingleObject

2

スレッドが自体アップ目を覚ますしません。メッセージを送信するスレッドは、を起動します。メッセージを送信するプロセスの一部は、メッセージの受信者を目覚めさせることを含む。

+0

アプリケーションのボタンをクリックすると、「メッセージを送信するプロセス」はWindows自体であると言えますか? – TomCaps

+0

キーボードやマウスドライバからスケジューラまで、多くのことが関係しています。典型的なケースでは、これらのすべてがWindowsの一部です。 –

関連する問題