2

複数のスレッド化されたフォームを MDIChild として持つことは可能ですか? 多くの処理 CPU を必要とする MdiChild 形式の ActiveX コントロールがあり、以下のサンプル コードを使用して、あるコントロールが別のコントロールに影響を与えないようにしたいと考えています。しかし、行 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
4

3 に答える 3

3

GUI要素は、メインイベントループでのみ初期化してアクセスする必要があります。大量の計算を非同期またはバックグラウンドスレッドで処理できます。

于 2012-09-20T04:11:50.410 に答える
1

BackgroundWorker http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.95).aspxを試してください

DoWork イベントで重い操作をすべて実行し、ProgressChanged/RunWorkerCompleted イベントを使用して UI 要素を更新します。

于 2012-09-20T04:14:46.647 に答える
0

これを実装する方法に関する利用可能なオプション

msdn の優れたサポート記事を見つけたところですマルチスレッド アプリケーションで Windows を作成する方法

親ウィンドウが 1 つのスレッドで作成され、子ウィンドウが別のスレッドで作成されている場合、ウィンドウを作成すると、暗黙のAttachThreadInput () を強制できます。ウィンドウが親子関係を持つ別のスレッドで作成 (または設定) されると、入力キューがアタッチされます。

詳細については、「 ウォークスルー: 各 Windows フォームを独自のスレッドに表示して COM 相互運用をサポートする」を参照してください。

同様の質問がSpawn a new thread to open a new window and close it from another thread

しかし、残念なことに、それらのどれも子フォームについて何も持っていません。

更新: ウォークスルー コードにバグが見つかりました。しかし、全体として、このサンプルにはいくつかの良いアイデアがあります。

于 2012-09-30T00:50:54.583 に答える