MFC 对话框冻结
Posted
技术标签:
【中文标题】MFC 对话框冻结【英文标题】:MFC dialog frozen 【发布时间】:2012-05-16 18:05:54 【问题描述】:我需要帮助如何解冻我的对话框。我正在使用 MFC,当按下按钮时,我想执行一个无限循环。但是,当无限循环开始时,对话框会冻结。现在我查看了this thread,那里有人遇到了类似的问题。
不幸的是,我尝试了多线程,但我发现它对我不起作用,因为我使用的是使用 OLE 自动化的 api,并且我遇到了未处理的内存异常。我认为这是因为程序使用了串口,而我在某个地方读到了你只能在一个线程中使用串口的句柄。
我的程序只是查看是否有人拨入了我的调制解调器并等待他们向我发送文件,然后挂断。这是我的循环。
while(1)
//get rid of input buffer
ts->_this->m_pHAScript->haReleaseRemoteInput();
ts-> _this->textBox->SetWindowTextA("thread Commence");
//wait for connected
if(success = ts->_this->m_pHAScript->haWaitForString("CONNECT",timeout))
//getFile
if(success = ts->_this->m_pHAScript->haWaitForXfer(5000))
//hangup
ts->_this->haTypeText("+++ath\r");
有没有办法解冻对话框?
【问题讨论】:
您仍然可以将多线程与 OLE 自动化结合使用。但是你必须在每个线程开始时调用 OleInitialize() ! 【参考方案1】:在while循环中添加这段代码:
MSG msg;
while(PeekMessage(&msg, GetSafeHwnd(), 0, 0, PM_REMOVE))
DispatchMessage(&msg);
【讨论】:
希望您不会遇到任何令人讨厌的重入错误。 很抱歉,您的解决方案不起作用。该循环导致我的循环中断,而且我的程序没有关闭。我的调试保持打开状态,程序启动的一些进程也保持打开状态【参考方案2】:Windows 中的 GUI 依赖于消息循环 - 在代码中的某处,无论是显式还是隐藏在框架中,都有一个循环检查队列中的消息并对其进行处理。如果有任何东西阻止代码返回该循环,GUI 就会冻结。
有几种方法可以解决这个问题。一个由David Brabant 给出,本质上是重复循环。另一种是启动一个独立运行阻塞操作的新“工作”线程。如果您的消息循环有一个在空闲时调用的函数,即队列中没有更多消息,您可以在那里进行一些处理;但是,在您的示例中这是不可能的。
【讨论】:
大卫解决方案的问题是,虽然当我按下关闭按钮时窗口关闭,但循环并没有中断。如何检查消息以查看是否按下了关闭按钮 @Mozly,在 PeekMessage 循环中,您可以检查消息是否为WM_QUIT
- 如果是,您应该退出外部循环。因为您正在调用阻塞函数 haWaitForString
和 haWaitForXfer
我怀疑他的解决方案是否适合您,因为您不会经常执行 PeekMessage
循环。以上是关于MFC 对话框冻结的主要内容,如果未能解决你的问题,请参考以下文章