![](/img/trans.png)
[英]how to prevent a certain mdichild form from getting focus/activation when switching between other mdichild forms using Ctrl+Tab? C#
[英]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元素。
有關如何實現此功能的可用選項
正如@Blorgbeard所建議的那樣,將MdiChild替換為Forms
剛剛找到了一篇不錯的msdn支持文章“ 如何在多線程應用程序中創建Windows”
當在一個線程中創建父窗口而在另一個線程中創建子窗口時,創建窗口可以強制使用隱式的AttachThreadInput ()。 在具有父子關系的單獨線程中創建(或設置)窗口時,將附加輸入隊列。
有關更多信息,請參見演練:通過在自己的線程上顯示每個Windows窗體來支持COM互操作。
提出了類似的問題生成新線程以打開新窗口並從其他線程關閉它
但是,不幸的是,這些都與兒童形式無關。
更新:剛剛在演練代碼中發現錯誤; 但總體而言,此示例具有一些好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.