Wat*_* v2 5 multithreading dispatcher message-loop
曾几何时,我记得这些东西.随着时间的推移,我的理解已经淡化,我的意思是刷新它.
我记得,任何所谓的单线程应用程序都有两个线程:
a)具有指向main或DllMain入口点的指针的主线程; 和
b)对于具有一些UI的应用程序,运行WndProc的UI线程(也称为辅助线程),即执行WndProc的线程,该线程接收Windows发布给它的消息.简而言之,执行Windows消息循环的线程.
对于UI应用程序,主线程处于阻塞状态,等待来自Windows的消息.当它收到它们时,它会将它们排队并将它们分派到消息循环(WndProc)并启动UI线程.
根据我的理解,处于阻塞状态的主线程是这样的:
while(getmessage(/* args &msg, etc. */))
{
translatemessage(&msg, 0, 0);
dispatchmessage(&msg, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)
Application.Run( new System.Windows.Forms() );
Run Code Online (Sandbox Code Playgroud)
这就是他们所谓的调度员吗?
我的问题是:
a)我的上述理解是否正确?
b)调度员到底是什么名字?
c)指向一个资源,我可以从Windows/Win32的角度更好地理解线程,然后将它与C#等高级语言联系起来.佩佐尔德在他的史诗作品中不遗余力地讨论这个问题.
虽然我相信我有点对,但确认会有所缓解.
这取决于您对主线程的看法。大多数 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;
...
}
};
Run Code Online (Sandbox Code Playgroud)
我遇到的大多数人都使用“调度程序”来描述不仅仅是简单传递的东西。在这种情况下,它根据类型变量执行不同的操作,这与我见过的大多数调度程序一致。switch 通常会被多态性所取代,但 switch 可以让示例更清楚地了解发生了什么。