2012-05-16 126 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