Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 线程101:什么是调度程序?_Multithreading_Dispatcher_Message Loop - Fatal编程技术网

Multithreading 线程101:什么是调度程序?

Multithreading 线程101:什么是调度程序?,multithreading,dispatcher,message-loop,Multithreading,Dispatcher,Message Loop,从前,我把这件事记在心里。随着时间的推移,我的理解已经淡化,我想刷新它 我记得,任何所谓的单线程应用程序都有两个线程: a) 具有指向main或DllMain入口点的指针的主线程;及 b) 对于具有某些UI的应用程序,UI线程,也称为WndProc运行的辅助线程,即执行WndProc的线程,该线程接收Windows向其发布的消息。简而言之,执行Windows消息循环的线程 对于UI应用程序,主线程处于阻止状态,等待来自Windows的消息。当它接收到它们时,它将它们排成队列,并将它们发送到消息循

从前,我把这件事记在心里。随着时间的推移,我的理解已经淡化,我想刷新它

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

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

b) 对于具有某些UI的应用程序,UI线程,也称为WndProc运行的辅助线程,即执行WndProc的线程,该线程接收Windows向其发布的消息。简而言之,执行Windows消息循环的线程

对于UI应用程序,主线程处于阻止状态,等待来自Windows的消息。当它接收到它们时,它将它们排成队列,并将它们发送到消息循环(WndProc),UI线程启动

根据我的理解,处于阻塞状态的主线程是:

C++ C#或VB.NET WinForms应用程序: 这就是他们所说的调度员吗

我的问题是:

a) 我的上述理解正确吗

b) 调度员到底是怎么回事

c) 请给我指出一个资源,在那里我可以从Windows/Win32的角度更好地理解线程,然后将其与高级语言(如c#)联系起来。佩佐尔德在他的史诗作品中对这一主题的讨论十分谨慎


虽然我相信我有点正确,但肯定会有所缓解。

< P>这取决于你考虑的主要线程。大多数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;
            ...
       }
   };

我遇到的大多数人都用“dispatcher”来描述一些不仅仅是简单的传递的东西。在本例中,它基于类型变量执行不同的操作,这与我所看到的大多数Dispatcher一致。通常,开关会被多态性所取代,但开关会使示例中发生的事情更加清晰。

谢谢,帕特罗斯。你的解释符合我的理解。那么,根据您的解释,如果我要将其与上面的代码相协调,那么调度程序的范围比上面的示例更广。上面的示例(C++和C#snippets)是dispatcher的示例。谢谢然而,你解释中的一些文字令人困惑。听起来,您对dispatcher的定义只描述了事件发布者和事件使用者之间的中介。你能用一些代码举例说明调度员吗?
Application.Run( new System.Windows.Forms() );
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;
            ...
       }
   };