线程101:什么是Dispatcher?

时间:2010-02-09 20:13:27

标签: multithreading dispatcher message-loop

曾几何时,我记得这些东西。随着时间的推移,我的理解已经淡化,我的意思是刷新它。

我记得,任何所谓的单线程应用程序都有两个线程:

a)具有指向main或DllMain入口点的指针的主线程;和

b)对于具有某些UI的应用程序,一个UI线程,即运行WndProc的辅助线程,即执行WndProc的线程,该线程接收Windows发布给它的消息。简而言之,执行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() );

这就是他们所谓的Dispatcher吗?

我的问题是:

a)我的上述理解是否正确?

b)地狱之名是Dispatcher?

c)指向一个资源,我可以从Windows / Win32的角度更好地理解线程,然后将它与C#等高级语言联系起来。佩佐尔德在他的史诗作品中不遗余力地讨论这个问题。

虽然我相信我有点对,但确认会有所缓解。

1 个答案:

答案 0 :(得分: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;
            ...
       }
   };

我见过的大多数人都使用“调度员”来描述一些不仅仅是简单的直通的东西。在这种情况下,它根据类型变量执行不同的操作,这与我见过的大多数调度员一致。通常,交换机被多态性替换,但是切换使得它更清楚一些例子。