Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows消息传递_C++_Windows_Winapi_Windows Messages - Fatal编程技术网

C++ Windows消息传递

C++ Windows消息传递,c++,windows,winapi,windows-messages,C++,Windows,Winapi,Windows Messages,我的问题是关于windows消息传递的。我有两个应用程序,通过WM_COPYDATA消息进行通信。在第一个应用程序中,还有一些应用程序定义的消息。问题是,当处理WM_COPDATA消息时,也会发送应用程序定义的消息,WM_COPYDATA处理停止,处理转到我的消息。当我加上主要的陈述时,我明白了。(实际上,它不会影响程序流。) 让我简单地谈谈程序流程。对于每个WM_COPYDATA消息,都会打开一个窗口,打开后会创建一个线程。此线程休眠4秒钟,然后使用SendMessage()发送MM_MY_消

我的问题是关于windows消息传递的。我有两个应用程序,通过WM_COPYDATA消息进行通信。在第一个应用程序中,还有一些应用程序定义的消息。问题是,当处理WM_COPDATA消息时,也会发送应用程序定义的消息,WM_COPYDATA处理停止,处理转到我的消息。当我加上主要的陈述时,我明白了。(实际上,它不会影响程序流。)

让我简单地谈谈程序流程。对于每个WM_COPYDATA消息,都会打开一个窗口,打开后会创建一个线程。此线程休眠4秒钟,然后使用SendMessage()发送MM_MY_消息。因此,在某个点上,WM_COPYDATA和MM_MY_消息对应。我所期望的是,在完成一条消息后,它将继续下一条消息。但情况不同

case WM_COPYDATA:
    std::cout << "WM_COPYDATA started" << std::endl;
    //
    // do some stuff.
    //
    std::cout << "WM_COPYDATA finished" << std::endl;
    return 0;
case MM_MY_MESSAGE:
    std::cout << "--MM_MY_MESSAGE started--" << std::endl;
    //
    // do some stuff.
    //
    std::cout << "--MM_MY_MESSAGE finished--" << std::endl;
    return 0;

“MM\u MY\u MESSAGE”打印如何介于WM\u COPYDATA打印之间?

您观察到的行为称为“重入”。用
do some stuff
表示的代码有助于产生-产生“泵送”消息队列(检索和分派挂起的窗口消息)。这包括但不限于显示模式对话框或上下文菜单;从单线程单元进行单元外COM调用;当然,调用
GetMessage
DispatchMessage
之类的东西,甚至从消息循环中调用
SendMessage
都会导致这种情况发生。如果没有看到您省略的代码,没有人能够确切地告诉您是什么导致了它。我已经添加了一些解释。无法显示内部case语句,因为它很长,某些相关代码位于另一个线程内,等等。但是case语句内没有SendMessage()调用。请使用调试器在
MM\u MY\u MESSAGE
案例上设置断点,然后按照堆栈跟踪查看可重入性来自何处。作为其实现的一部分,可能会调用
SendMessage
,从而打开了重新进入的可能性<代码>发送消息发送入站跨线程发送的消息。
WM_COPYDATA started
WM_COPYDATA finished
WM_COPYDATA started
WM_COPYDATA finished
WM_COPYDATA started
--MM_MY_MESSAGE started--
--MM_MY_MESSAGE finished--
WM_COPYDATA finished