-1

私は VB と .Net が初めてで、続行できないタスクがあります。

  1. screen1 の読み込み時にスレッドを開始します。次に、ユーザーは screen2 に移動します。
  2. screen2 では、スレッドはまだ遅れて実行されています。ユーザーがscreen2でアクション(クリックなど)を実行すると、スレッドがトリガーされ、screen2の要素にアクセスします
  3. 画面 2 の要素は動的に作成され、IDE で設計されていません。

したがって、本質的に、あるフォームで作成されたスレッドは、別のフォームで動的に作成されたフォーム要素にアクセスする必要があります。

私の質問が単純すぎる場合は、ご容赦ください。明確でない場合はお知らせください。言い換えます。

注: 私が話している要素は、基本的にフロー レイアウト パネル内の画像ボックスです。

前もって感謝します すべての助けが熱心に(今爪を噛んでいます)待っており、大いに感謝しています。

編集

  1. ctThread というスレッドがダッシュボード画面で開始されたとします。

    ctThread.start()

  2. このスレッドは無限に実行され、トリガー イベントを待機しています。

  3. 一方、ユーザーは QuizScreen という画面に移動し、この画面 (フォーム) で、名前がわかっている動的に作成された要素を更新する必要があります。

  4. そのため、待機中の ctThread (リスナー スレッド) のタイミングが来ると、下のサブルーチンが呼び出されます。

サブ

public sub changeComputerStatus(ByVal node)
    Dim flowpanel As FlowLayoutPanel = CType(QuizScreen.FlowLayoutPanel1.Controls("flow_" + node), FlowLayoutPanel)
    Dim pictControl As PictureBox = CType(flowpanel.Controls("pict_" + node), PictureBox)
    pictControl.Image = System.Drawing.Image.FromFile(Application.StartupPath & "\images\application-on.png")
end sub

ここでノードは変化し続けます。これが、作成する各コントロールを区別する方法です。

注 : このスレッドは、dashboardscreen という画面で開始され、ユーザーは現在別の画面 QuizScreen にいます。

上記のサブルーチンの最初の行が実行され、フローパネルに何も返されません。したがって、次の行に移動するとき、何も参照することはできません。したがって、上記のエラー。

4

1 に答える 1

1

2つのこと。

  1. 知っておくべき最も重要なことは、バックグラウンド スレッドからコントロールのプロパティに直接アクセスできないことです。コントロールは、フォアグラウンド UI スレッドからのみ操作できます。バックグラウンド スレッドからコントロールにアクセスするには、何らかの形式の非同期プログラミングを使用する必要があります。たとえば、.NET 1.x - 3.5 でデリゲートを作成するか、新しいTask<T>and asyncand andawaitキーワードを使用します。

  2. 動的に作成されたコントロールをフォームのコントロール コレクションに実際に追加しましたか? 上記の 1 で説明したように、デリゲートまたはその他の非同期メソッドを介してコントロールにアクセスする必要があります。

アップデート:

以下の OP のコメントの質問に答えるにはInvoke、UI オブジェクトのメソッドを使用することもできます。基本的に、呼び出されたメソッドを実行するように .NET に指示し、UI オブジェクトの作成スレッド (この場合は UI スレッド) で実行します。これが必要です。これにより、(呼び出されたメソッドまたはプロパティに応じて) コントロールを「バックグラウンドから」「更新」することができます。UI オブジェクトでメソッドを呼び出すと、invkoked メソッドが UI スレッドで実行され、おそらくバックグラウンド タスクからそのメソッドに渡されたデータが使用されます。

また、MSDN のドキュメントも参照してください(これは .NET 2.0 で導入され、.NET 4.5 ではandキーワードにBacgkroundWorker取って代わられています)。あなたが求めていることをどのように行うかを正確に説明する多くのドキュメントが利用可能です。MSDN または Bing (または好みの検索エンジン) でクイック検索を実行して見つけるのは難しくありません。asyncawaitTask<T>

于 2013-07-31T13:10:43.073 に答える