簡體   English   中英

如何創建多個線程形式為MDIChild

[英]How to create multiple threaded Forms as MDIChild

是否可以將多個線程形式作為MDIChild? 我有一個MdiChild形式的ActiveX控件,該控件可能會占用大量處理CPU,並且想通過使用下面的示例代碼來使一個控件不會影響另一個控件。 但是行frmDoc.MdiParent = Me引發跨線程異常。

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

GUI元素必須僅在主事件循環中初始化和訪問。 您可以異步或在后台線程中處理大量計算。

嘗試BackgroundWorker http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker(v=vs.95).aspx

在DoWork事件中執行所有繁瑣的操作,並使用ProgressChanged / RunWorkerCompleted事件更新UI元素。

有關如何實現此功能的可用選項

剛剛找到了一篇不錯的msdn支持文章“ 如何在多線程應用程序中創建Windows”

當在一個線程中創建父窗口而在另一個線程中創建子窗口時,創建窗口可以強制使用隱式的AttachThreadInput ()。 在具有父子關系的單獨線程中創建(或設置)窗口時,將附加輸入隊列。

有關更多信息,請參見演練:通過在自己的線程上顯示每個Windows窗體來支持COM互操作。

提出類似的問題生成新線程以打開新窗口並從其他線程關閉它

但是,不幸的是,這些都與兒童形式無關。

更新:剛剛在演練代碼中發現錯誤; 但總體而言,此示例具有一些好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM