2012-05-16 129 views
0

我需要帮助如何解冻我的对话框。我正在使用MFC,并且我有一个无限循环,我想在按下按钮时执行。但是,当无限循环开始时,对话框会冻结。现在我看着this thread,有人遇到类似的问题。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"); 
      } 
     } 

    } 

有没有解冻对话框的方法?

+0

你仍然可以使用与OLE自动化的多线程。但是你必须在每个线程开始时调用OleInitialize()! – Stefan

回答

1

里面添加这个代码,同时循环:

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

并希望你不会遇到任何讨厌的再入漏洞。 – asawyer

+0

我很抱歉地说,但您的解决方案不起作用。该循环导致我的循环中断,而且,我的程序也没有关闭。我的调试保持打开状态,程序启动的一些进程也保持打开状态 – Mozly

1

在Windows的GUI依赖于一个消息循环 - 地方在你的代码,任何明示或隐藏在一个框架中,有一个循环,检查在消息一个队列并对其进行处理。如果有任何东西阻止代码返回到该循环,GUI将被冻结。

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

+0

David的解决方案存在的问题是,尽管按下关闭按钮时窗口会关闭,但循环不会中断。我如何检查邮件,看看是否关闭按钮是按 – Mozly

+0

@Mozly,在PeekMessage循环,你可以检查邮件是否是'WM_QUIT' - 如果是这样你应该退出你的外环。因为你在调用阻塞函数'haWaitForString'和'haWaitForXfer',我怀疑他的解决方案对你有用,因为你不会经常执行'PeekMessage'循环。 –

+0

啊,我看到谢谢!我有我的计划做我想做的事 – Mozly