0

我需要帮助如何解冻我的对话框。我正在使用 MFC,当按下按钮时,我想执行一个无限循环。但是,当无限循环开始时,对话框会冻结。现在我查看了 有人遇到类似问题的线程。

不幸的是,我尝试了多线程,但我发现它对我不起作用,因为我使用的是使用 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");
            }
        }

    }

有没有办法解冻对话框?

4

2 回答 2

1

在 while 循环中添加此代码:

MSG msg;
while(PeekMessage(&msg, GetSafeHwnd(), 0, 0, PM_REMOVE))
{
  DispatchMessage(&msg);
}
于 2012-05-16T18:09:15.970 回答
1

Windows 中的 GUI 依赖于消息循环 - 在代码中的某处,无论是显式还是隐藏在框架中,都有一个循环检查队列中的消息并对其进行处理。如果有任何东西阻止代码返回该循环,则 GUI 将被冻结。

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

于 2012-05-16T18:47:17.033 回答