MFC对话框已冻结

时间:2012-05-16 18:05:54

标签: multithreading mfc dialog serial-port modem

我需要帮助如何解冻我的对话框。我正在使用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");
            }
        }

    }

有没有办法解冻对话框?

2 个答案:

答案 0 :(得分:1)

在循环中添加此代码:

MSG msg;
while(PeekMessage(&msg, GetSafeHwnd(), 0, 0, PM_REMOVE))
{
  DispatchMessage(&msg);
}

答案 1 :(得分:1)

Windows中的GUI依赖于消息循环 - 代码中的某个地方,无论是显式还是隐藏在框架中,都有一个循环来检查队列中的消息并对其进行处理。如果有什么阻止代码返回到该循环,GUI就会被冻结。

有几种方法可以解决这个问题。一个由David Brabant给出,基本上复制了循环。另一种方法是启动一个独立运行阻塞操作的新“工作”线程。如果你的消息循环有一个它在空闲时调用的函数,即队列中没有更多消息,你可以在那里进行一些处理;但是,在你的例子中这是不可能的。