【问题标题】:Thread message pump线程消息泵
【发布时间】:2021-09-09 12:43:24
【问题描述】:

我想对消息泵在 Windows 系统中的工作原理有一个实际的了解。我创建了一个控制台应用程序。我在这个应用程序中创建了新线程:

var thread = new Thread(MessagePump) {IsBackground = true};
 _thread.Start();

消息泵送如下所示:

MSG msg; 
while (GetMessage(&msg, NULL, 0, 0))
{ 
   TranslateMessage(&msg); 
   DispatchMessage(&msg); 
} 

我使用另一个程序向该线程发送消息。我看到线程正在接收我的消息。我想了解这是如何发生的。我还没有为这个线程创建一个窗口。根据instructions,需要一个窗口来接收消息。

【问题讨论】:

  • 你如何“向这个线程发送消息”?
  • var Thread = new Thread 建议使用 C#。您引用的消息泵循环是 C++。我想你很困惑,因为你混合了不同的语言,它们以不同的方式工作。
  • 如果您没有窗口,那么您必须使用 PostThreadMessage()。专为此用途而设计。如果线程拥有任何可见窗口,则绝对不能使用,当线程进入模式消息循环(例如调整窗口大小)时,消息会丢失。

标签: windows multithreading message-pump


【解决方案1】:

线程何时可以接收消息的规则是spelled out

当线程第一次调用用户或 GDI 函数之一时,系统会创建线程的消息队列。

线程不需要窗口来接收消息。正如文档所解释的,发布到线程的消息与窗口无关,并且遵循略有不同的规则。

【讨论】:

    猜你喜欢
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2010-11-11
    • 2012-04-15
    • 2012-07-06
    • 2013-04-11
    • 1970-01-01
    相关资源
    最近更新 更多