2012-09-20 74 views
2

是否可以將多個線程窗體作爲MDIChild?我有一個MdiChild窗體中的ActiveX控件,它可能需要很多處理CPU,並且希望通過使用下面的示例代碼使這一個控件不會影響另一個控件。但行frmDoc.MdiParent =我引發了跨線程異常。如何創建多個線程窗體作爲MDIChild

Dim frmDoc As MDIChild 
Dim newThread As New Thread(
    Sub() 
     frmDoc = New MDIChild 
     frmDoc.MdiParent = Me '<- this line throws cross threading exception. 
     Application.Run(frmDoc) 
    End Sub 
) 
newThread.IsBackground = True 
newThread.SetApartmentState(ApartmentState.STA) 
newThread.Start() 

拋出System.InvalidOperationException了未處理的:

Message=Cross-thread operation not valid: 
    Control 'FormMdiApp' accessed from a thread other than the thread it was created on. 
Source=System.Windows.Forms 
+0

您可以使用ActiveX控件的非MDI表單製作此表單嗎? – Blorgbeard

+0

只是想着,是否有可能在C++ MFC應用程序中完成? – walter

+0

我不知道C++ MFC,但如果您只是將'frmDoc'更改爲非MDI子窗體,它應該可以工作。當然,你需要小心「調用」任何時候你需要從另一個線程訪問它。 – Blorgbeard

回答

3

GUI元素必須被初始化,並且僅在主事件循環訪問。您可以異步處理大量計算或在後臺線程中處理大量計算。

+1

可以有多個表單,每個表單都有自己的線程和消息循環,但我認爲它不適用於MDI子項。 – Blorgbeard

+1

@Blorgbeard,這樣做合理嗎?我從來沒有面對多個線程中的多個表單。你能展示例子嗎?謝謝。 –

+0

是的,這是可行的。基本上你做什麼OP在做什麼,除了沒有MDI表格。在新的(STA)線程中,您創建一個表單,然後將其傳遞給Application.Run,​​它爲您設置一個新的事件循環。你需要小心地調用任何跨線程調用,但它的工作原理。 – Blorgbeard

0

如何

  • Running a WPF control in another thread

  • 與形式實現這個

    剛剛發現一個很好的MSDN支持文章How To Create Windows in a Multithreaded Application

    創建一個窗口可以強制一個隱式AttachThreadInput(),當一個線程創建 父窗口和子窗口正在被另一個線程創建 。當在具有父子關係的單獨線程中創建(或設置)窗口時,連接輸入隊列 。可以 Walkthrough: Supporting COM Interop by Displaying Each Windows Form on Its Own Thread

    類似問題找到

    更多信息被問到Spawn a new thread to open a new window and close it from a different thread

    但是,那些anfortunatelly非有關於子窗體東西。

    更新:在演練代碼中發現錯誤;但總體來說這個樣本有一些好點子。

    相關問題