SendMessage()
,Windows可以激活该线程中的另一个光纤以处理下一个
SendMessage()
,以便两个SendMessage()
调用以非同步方式在接收线程中活跃,尽管它们都在同一接收线程中运行。
在某些应用程序中,您需要意识到这一点。例如:在过程1中,您执行:
SendMessage()
窗口句柄
SendMessage(hWnd, msgAdd, 0, 0); // in thread 1
SendMessage(hWnd, msgAdd, 0, 0); // in thread 2
属于进程2,该消息在过程2中处理如下:
hWnd
执行两个调用后,变量
int Counter = 0;
void add(){
int myCounter = Counter;
SendMessage (...); // any SendMessage, so that Windows can activate another fiber
Counter = myCounter++;
}
可以为1或2,具体取决于Windows计划的方式。
如果您尝试:SendMessage()
您可能会崩溃,因为
Counter
功能检测到死锁情况(同一线程)。您将需要纤维同步。 因此,到目前为止,我们的知识来自转储分析和调试。 Microsoft在about消息和消息队列中说:
注意接收线不必明确地产生控制;调用以下任何功能都会导致线程隐式产生控制。 ...
sendmessage
在这里,“收益控制”的意思是:Windows内部调用该功能void add(){
std::lock_guard<std::mutex> lock(myMutex);
...
使另一个光纤运行。在我们的情况下,使用
lock()
而不是解决问题。可能有人有有关
fiber.yield()
和纤维的更多特定信息?
GUI基本上是单线程。请记住,它是在不存在多线程的Windows 1.0时期发明的。 您应该将
PostMessage()
视为递归电话,但这是交叉过程。 一旦您意识到这一点,并想象您的计算机只有一个核心,并且没有两个线程同时运行,您就可以将
SendMessage()
视为递归。