【问题标题】:Threading 101: What is a Dispatcher?线程 101:什么是调度程序?
【发布时间】:2010-02-09 20:13:27
【问题描述】:

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

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

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 在他史诗般的作品中对这个主题的讨论很谨慎。

虽然我相信我说得有点对,但确认一下就会缓解。

【问题讨论】:

    标签: multithreading dispatcher message-loop


    【解决方案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 可以更清楚地说明发生了什么。

    【讨论】:

    • 谢谢,帕特罗斯。你的解释符合我的理解。那么,根据您的解释,如果我要将它与上面的代码进行协调,那么调度程序的范围比上面的示例更广泛。上述示例(C++ 和 C# sn-ps)是调度程序的样本。谢谢。但是,您解释中的某些文字令人困惑。听起来您对调度程序的定义仅描述了事件发布者和事件使用者之间的中介。你能用一些代码举例说明一个调度程序吗?
    猜你喜欢
    • 2010-09-19
    • 2013-05-29
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多