0

別の質問への回答によると、VB ユーザー インターフェイスを作成したスレッドがビジー状態の場合、VB ユーザー インターフェイスは更新できません。したがって、通常、大きな計算ジョブをバックグラウンド タスクで実行する必要があるのはなぜですか。

ここで何が不可解なのかを説明します。次のコードがあります。このように、インプロセス COM を介して呼び出されます。

  1. クライアントの呼び出しshowform()
  2. クライアントは大量の作業を行い、その過程で独自の UI をフリーズします
  3. クライアントは作業を終了し、独自の UI の更新に戻ります

ステップ 2 では、VB フォームはそこにありますが、フリーズしています。対話することはできません。手順 3 で、VB フォームが使用可能になります。しかし、これはなぜですか?実行のスレッドはクライアントに返されましたか? クライアントが何らかの方法でフォームのイベントを処理している場合、処理するイベントとその送信先をどのような魔法で知っているのでしょうか?

<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _
Public Class ComClass1

  Public Sub New()
      MyBase.New()
  End Sub

  Private f1 As Form1

  Public Sub showform()
      f1 = New Form1()
      f1.Show()
  End Sub

End Class
4

2 に答える 2

2

あなたが話す魔法は、Windows プログラミングの基礎です。以前の質問に対する私の回答では、これを修正できる理由と方法について説明しています。COM 呼び出しを行う場合、クライアント アプリケーションはプロシージャをアプリケーションにインポートするだけです。コードを自分で入力してフォームを作成するか、入力したコードを使用してフォームを作成するかにかかわらず、オブジェクトと所有者の関係の性質は変わりません。あなたへの COM 呼び出しは、呼び出しを行ったスレッド (クライアント UI スレッド) に属しますshowFormf1そのウィンドウのウィンドウ ハンドルは、それを作成した UI スレッド (クライアント) が引き続き担当します。

フォームを作成すると、メールボックス (ウィンドウ ハンドル) が作成されるだけです。UI スレッドはメールマン (メッセージ ポンピング ループ) です。クライアントに新しいメールマンを提供するのではなく、メールボックスを持つ新しいオブジェクトを提供するだけです。クライアント プログラムがプロシージャへの COM 呼び出しを行ってウィンドウを作成すると、クライアント プログラム (クライアント UI スレッド) は新しいフォームのメールボックスにメッセージを配信する責任を負います (そのウィンドウ ハンドルをメイン UI スレッドに登録します)。彼らの郵便配達員は、ビジュアル オブジェクトを機能させるためにメッセージを送信する必要があります。彼が小数点以下 1 兆桁まで円周率を計算するのに忙しい場合、あなたのオブジェクトは彼のメール ルート上の他のすべてのものと同様にフリーズします。

于 2012-06-23T09:16:36.893 に答える
0

form.load イベントを確認してください。フォームがコードをロードして実行します...そこでフリーズします。

于 2012-06-23T08:59:34.920 に答える