为什么AFXMessageBox首先处理其他消息
Why does AFXMessageBox process other messages first?
我有一个基于MFC对话框的应用程序,其线程监视串行端口连接。为了简单起见,在此示例中,我只是模拟背靠背发送的数据。
如果我调用 Thread2(),它将发布三条消息,例如,假设在 TestFunction() 被调用一次之前发布了所有三条消息,这就是我所看到的,但我认为它不会总是以这种方式发生。 在我添加 Afxmessagebox 之前,事情运行良好,但之后,事情变得奇怪了。
#define WM_TEST_MESSAGE WM_USER+9
bool ALERT_USER = true;
BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
ON_MESSAGE(WM_TEST_MESSAGE, TestFunction)
END_MESSAGE_MAP()
// On thread 1
LRESULT CMyDlg::TestFunction(WPARAM ch, LPARAM port)
{
TRACE("Before AFXn");
if (ALERT_USER)
{
AfxMessageBox("About to disable alert!");
ALERT_USER = false;
}
TRACE("After AFXn");
return 0;
}
// On thread 2
void Thread2()
{
::PostMessage(port->m_pOwner->m_hWnd, WM_TEST_MESSAGE, (WPARAM)0, (LPARAM)0);
::PostMessage(port->m_pOwner->m_hWnd, WM_TEST_MESSAGE, (WPARAM)0, (LPARAM)0);
::PostMessage(port->m_pOwner->m_hWnd, WM_TEST_MESSAGE, (WPARAM)0, (LPARAM)0);
}
这是我期望看到的:
Before AFX
About to disable alert!
After AFX
Before AFX
After AFX
Before AFX
After AFX
这是我实际得到的:
Before AFX
Before AFX
Before AFX
About to disable alert!
After AFX
After AFX
After AFX
About to disable alert!
About to disable alert!
我发现获得所需结果的最佳方法是将ALERT_USER设置为 false 的顺序与消息框交换,所以这不是真正的问题。
但是,我真的很想了解发生了什么。 逐步完成代码,我最好的猜测是AFXMessageBox在运行之前强制其他所有内容通过消息队列。
谁能解释一下AfxMessageBox在幕后做什么?
当您调用 AfxMessageBox
时,它会进入消息循环,现在WndProc
可以处理新的传入消息。这就是MFC/Windows的工作方式 - 它们继续等待新消息(除非被阻止)。请注意,使用 [Afx]MessageBox
显示消息框不是阻塞操作 - 它宁愿进入消息循环。
Sleep
调用或套接字等待将是一个阻塞操作。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- boost::进程间消息队列引发错误
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 带有 esp32 的 AWS 物联网接收来自某些主题的消息,但无法接收其他主题的消息?
- 如何从其他线程 winapi 获取消息
- 错误 LNK1104:错误消息中显示的路径未在其他依赖项中定义
- 如何从VCL项目的消息循环中调用其他功能
- 如何只插入数字和字母应该显示消息或其他内容
- 如果不是,如何停止显示来自其他的消息
- 为什么AFXMessageBox首先处理其他消息
- 如何使用 c++ 从其他应用程序关闭设备启动时生成的错误消息框
- 向同一网络上的应用程序的所有其他实例发送消息
- "n"是未声明的错误消息以及其他可能的编程错误
- 在c++中对来自其他正在运行的线程的消息对话框进行建模
- 通过杂注消息打印基于其他宏的定义数值?
- 如何在主窗口上打印来自其他类的消息(QString)
- 发送包含其他结构体的结构体作为ZeroMQ消息
- C++ 如果和如果其他错误消息
- c++ /(MFC dummy)和纯Win MessageBox() -如何删除消息队列或以其他方式删除现有的鼠标点击/