::SetActiveWindow(hParent);
return TRUE;
}
}
else ::WaitMessage();
}
return FALSE;
}
这样就可以解释明白了:
(1)当在我的线程A中使用这个策略解决问题时,由于我的是普通的CWnd窗口,并且是PostMessage方式来调用我的OnConfig()函数的,所以这个时候是不存在消息重入的,
所以根本不能起作用。
(2)当将这个处理逻辑移到目标线程B,并且我以SendMessage(UM_CONFIG)的时候,这时候是存在消息重入的,因为SendMessage是直接调用的消息处理函数,不存在进入消息
队列等待的情况。但是为什么最终还是会出现两个设置对话框呢,我觉得原因可能在于:点击'设置'按钮的速度过快,导致第一个设置窗口还没有开始设置m_bIsOnlay的值为false
之前,就已经进入了第二个设置窗口的响应。enablewindow showwindow
(3)当将这个处理逻辑移到目标线程B,并且我以PostMessage(UM_CONFIG)发送消息的时候,问题完美解决。原因:这个时候存在消息重入,由于我是PostMessage的,所以
UM_CONFIG会进入到线程B的消息队列,这样线程B在处理第一个消息的时候,先设置好了m_bIsOnly=false,后才会创建自己的消息循环,取得第二个UM_CONGIG消息,调用消息处理
函数,这时m_bIsOnly=FALSE,所以直接返回,达到了只出现一个设置对话框的目的。
最后总结下消息重入的两种情况:
1.SendMessage
2.模态对话框,MessageBox之类内部拥有自己的消息循环的情况
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-27964-2.html
那一千五都没有
欧盟绝对不会放过这个机会正式转正