5

曾几何时,我牢牢记住了这件事。随着时间的流逝,我的理解已经淡化,我打算刷新它。

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

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() );

这就是他们所说的调度员吗?

我的问题是:

a) 我的上述理解正确吗?

b) 调度员到底是什么鬼?

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;
            ...
       }
   };

我遇到的大多数人都使用“调度程序”来描述不仅仅是简单的传递。在这种情况下,它基于类型变量执行不同的操作,这与我见过的大多数调度程序一致。通常 switch 会被多态性所取代,但是 switch 可以更清楚地说明发生了什么。

于 2010-02-09T20:51:40.103 回答