5

むかしむかし、私はこのことを暗記していました。時間が経つにつれて、私の理解は希薄になり、それをリフレッシュするつもりです.

思い出すと、いわゆるシングル スレッド アプリケーションには 2 つのスレッドがあります。

a) メインまたは DllMain エントリ ポイントへのポインタを持つプライマリ スレッド。と

b) いくつかの UI、UI スレッド、別名、WndProc が実行されるセカンダリ スレッド、つまり、Windows がポストするメッセージを受信する WndProc を実行するスレッドを持つアプリケーションの場合。つまり、Windows メッセージ ループを実行するスレッドです。

UI アプリの場合、プライマリ スレッドは Windows からのメッセージを待機しているブロック状態にあります。それらを受信すると、それらをキューに入れ、メッセージ ループ (WndProc) にディスパッチし、UI スレッドが開始されます。

私の理解によると、ブロッキング状態にあるプライマリスレッドは次のとおりです。

C++

while(getmessage(/* args &msg, etc. */))
{
    translatemessage(&msg, 0, 0);
    dispatchmessage(&msg, 0, 0);
}

C# または VB.NET WinForms アプリ:

Application.Run( new System.Windows.Forms() );

これは彼らがディスパッチャーと呼んでいるものですか?

私の質問は次のとおりです。

a) 上記の理解は正しいですか?

b) Dispatcher とはいったい何者なのか?

c) Windows/Win32 の観点からスレッドをよりよく理解し、それを C# などの高水準言語と結びつけることができるリソースを教えてください。Petzold は、彼の壮大な作品の主題に関する彼の議論で控えめです。

私はそれがある程度正しいと信じていますが、確認は安心します.

4

1 に答える 1

1

それは、何をプライマリ スレッドと見なすかによって異なります。ほとんどの UI フレームワークには、ほとんどアイドル状態で低レベルのイベントを待機するイベント ハンドラー スレッドがあります。イベントが発生すると、このスレッドはイベント キューでロックを取得し、そこにイベントを追加します。ただし、これは私が主要なスレッドと見なすものではありません。

一般に、ディスパッチャーはいくつかのイベントを受け取り、その内容またはタイプに基づいて、それらを別のコードのチャンク (多くの場合、別のスレッドにありますが、常にではありません) に送信 (必要に応じてディスパッチ) します。この意味で、イベント ハンドラー スレッド自体は単純なディスパッチャーです。キューの反対側では、フレームワークは通常、イベントをキューから取り出す別のディスパッチャーを提供します。たとえば、マウス イベントをマウス リスナーに送信したり、キーボード イベントをキーボード リスナーに送信したりします。

編集:

単純なディスパッチャは次のようになります。

class Event{
   public:
   EventType type; //Probably an enum
   String data; //Event data
};

class Dispatcher{
   public:
   ...

   dispatch(Event event)
   {
      switch(event.type)
      {
         case FooEvent:
            foo(event.data);
            break;
            ...
       }
   };

私が会ったほとんどの人は、単なるパススルー以上のものを説明するために「ディスパッチャ」を使用しています。この場合、私が見たほとんどのディスパッチャと一致する型変数に基づいて、さまざまなアクションを実行します。多くの場合、スイッチはポリモーフィズムに置き換えられますが、スイッチを使用すると、例として何が起こっているかが明確になります。

于 2010-02-09T20:51:40.103 に答える