2011-08-04 73 views
2

在最後幾個小時我一直在努力與代表和訪問Windows窗體,我已經使用本教程控制(C++)(第一個線程安全的方法):http://msdn.microsoft.com/en-us/library/ms171728.aspx#Y190Windows窗體:線程安全訪問GUI?

改變文本框和標籤完美的作品,但是當我想從另一個線程顯示或隱藏整個GUI失敗。

我使用下面梅索德(其是GUI類的一部分):

System::Void UI::showUI(boolean value) { 
    if (this->InvokeRequired) {  
     SetTextDelegate^ d = gcnew SetTextDelegate(this, &UI::showUI); 
     this->Invoke(d, gcnew array<Object^> { value }); 
    } else { 
     if (value == true) 
      this->Show(); 
     else 
      this->Hide(); 
    } 
} 

在第一呼叫,以便調用被稱爲if-子句爲真。但是通常showUI方法應該在if-子句返回false時自動調用,但這不會發生。所以GUI既沒有顯示也沒有隱藏。

是否需要使用委託來顯示/隱藏GUI,或者我可以從每個可能的線程執行該操作嗎?如果需要委託,爲什麼showUI不能再次執行?

感謝, 馬丁

編輯:好的名字SetTextDelegate是不恰當的,但是這並不是問題的關鍵...

回答

2

這是僵局的一個非常標準的情況下,控制並不少見::調用()。它只能在UI線程不忙時繼續進行。使用調試+ Windows +線程並雙擊主線程。看看調用堆棧,看看它在做什麼。典型的情況是阻塞,等待線程完成工作。這將永遠不會發生,因爲線程無法完成,直到Invoke()調用返回。

不要阻塞UI線程。

考慮使用BackgroundWorker,它的RunworkerCompleted事件可以在線程完成後執行任務,而不需要阻塞。

+0

啊就這麼簡單!非常感謝,我明天會更改它(下午11:30)... – martin

+0

完美無缺 - 謝謝! – martin