gpt4 book ai didi

Windows消息循环困惑

转载 作者:可可西里 更新时间:2023-11-01 11:55:14 25 4
gpt4 key购买 nike

我在 WTL 中有一个 GUI 窗口,它在 CMessageLoop 实例内的线程内运行,该实例已添加到应用程序实例并运行。现在,在主 GUI 的按钮处理程序中,我创建了一个新窗口。单击该按钮并创建窗口并尝试将退出消息发布到主 GUI 循环后。代码:

主窗口,有自己的线程:

    CMessageLoop theLoop;
_MyppModule.AddMessageLoop(&theLoop);
if(m_pMyDlg == NULL) {
m_pMyDlg = new CMyDlg();
if(!IsWindow(*m_pMyDlg))
{
m_pMyDlg->Create(NULL);
m_pMyDlg->ShowWindow(SW_SHOW);
nRet = theLoop.Run();
_MyppModule.RemoveMessageLoop();
}
}

按钮处理程序和子窗​​口创建:

LRESULT CMyDlg::OnButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{

ChildWindowDlg childDlg;
childDlg.Create(m_hWnd);

childDlg.ShowWindow(SW_SHOW);

CMessageLoop _loop;
);

_loop.Run();
::DestroyWindow(childDlg);

return S_OK;
}

现在,如果我在我的 MyDlg 窗口中单击关闭按钮,按钮的处理程序将被调用,我在其中执行 ::PostQuitMessage 但它永远不会从第一个代码片段到达 theLoop 消息循环。这发生在我退出第二个循环之后,因此 _loop 被销毁并且子对话框被销毁。这里发生了什么?

最佳答案

这里有两个消息循环,子循环是嵌套的。另一方面,消息队列是每个线程一个,并由最内层的消息循环(使用 GetMessage)抽取。因此,WM_QUIT 消息由 CMyDlg::OnButtonClicked 中的内部消息循环检索。

关于Windows消息循环困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18897443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com