2012-05-14 41 views
-1

我使用下面的代碼在我的函數打開一個新的形式(即用戶輸入):從每個線程內部打開新窗體?

Form4 f4 = new Form4(); 
f4.mainform = this; 
f4.get_Text(matchString); 
f4.ShowDialog(); 

它的正常使用時不穿,但是當我嘗試在兩個線程運行函數我只得到1個窗體彈出。我如何調整它以支持多個線程?

+0

ShowDialog()用於「鎖定」您的UI,直到處理完該表單。如果你需要打開多個表單,你可以使用Show()。也許我錯過了這一點。 – Jmyster

+0

我需要用戶界面來鎖定線程,但我希望每個線程都顯示一個彈出窗口 – user1213488

+1

您只有一個用戶界面。 ShowDialog函數專門用於模態對話框,即用於鎖定應用程序UI的對話框。 –

回答

1

您可以從任何線程中打開一個窗體,你只需要在新的線程啓動消息循環,如:

Application.Run(f4) 

Run方法將不會返回,直到窗體關閉。不過,它可能會導致問題,因此您需要小心並知道自己在做什麼。除非真的很痛苦,否則我會更早考慮重新設計代碼以使其更加異步。例如,您可以創建一個事件處理程序方法來偵聽表單的關閉事件。

0

WIN32消息泵在一個線程上運行 - GUI線程。只要你.ShowDialog(),c#停止,直到用戶關閉對話框。即使您使用.Show()來避免「停止並等待用戶推送正常」,仍然必須通過GUI線程處理GUI線程上的所有GUI事件。

支持多線程的方法是在備用線程上執行非GUI工作。

0

ShowDialog確實會抽取消息,因此它在技術上可以在單獨的線程上工作而不需要專門的消息循環。但是,您目前擁有的內容看起來像是災難處方,因爲該表單似乎通過f4.mainform = this提及了另一個表單,並且可能試圖訪問該表單。如果沒有亂拋垃圾(而且我的意思是這樣),你只能用一堆InvokeBeginInvoke調用代碼。

此外,在除主UI線程之外的線程上運行UI表單通常效果不佳。有幾個模糊的問題可以解決。例如,由於會有兩個UI線程在運行,因此可以打開兩個活動的模式對話框。一個可能隱藏在另一個之後,最終用戶不會看到它。除此之外,這個原因是爲什麼通常不推薦使用多個UI線程。

我的建議是找出一種方法來使這個工作與單個UI線程。如果你這樣做,你的生活會變得更簡單。