プロが教えるわが家の防犯対策術!

VB2010で、別スレッドの変数をメインフォームが閉じられた時に
表示するプログラムを書いたのですが、変数の中身が空になってしまいます。
色々試してみたのですが、うまく値を参照できません。
別スレッド上の値をどうやったら参照できるのでしょうか?

以下のような感じで記述したのですが、何か特別な書き方があるのでしょうか?
わかりにくい質問ですが、ご回答おねがいします。m(_ _)m
簡単なイメージを書きました。
http://www.progoo.com/rental/img_bbs1/img_data/1 …

'メインフォーム
Public Class Form1

 '★変数testをpublicで宣言
  Public test As String=""

 '★ロードしたらBackgroundWorker1を動かす
  Private Sub Form1_Load() Handles MyBase.Load
    BackgroundWorker1.RunWorkerAsync()
  End Sub

 '★BackgroundWorker1はModule1.test()を動かしてtestに"成功"の文字列を入れる
  Private Sub BackgroundWorker1_DoWork() Handles BackgroundWorker1.DoWork
    Module1.test()
  End Sub

 '★フォームを閉じた時に変数testを表示する
  Private Sub Form1_closing() Handles MyBase.FormClosing
    MsgBox(test)
  End Sub
End Class

'別モジュール
Module Module1
  Public Sub test()
    Form1.test = "成功"
  End Sub
End Module

A 回答 (1件)

ThreadStatic属性を使わない限り,フィールドはスレッドに関係なく存在します。


Form1_LoadでRunWorkerAsyncの代わりにModule1.testを呼び出しても,やはりフォームを閉じるときに「成功」とは表示されないはずです。

問題点は,Module1.testの方にあります。
Form1というのはクラスであって,インスタンスではありません。
そのため,本来ならば
Form1.test = "成功"
というコードはエラーになります。
# VB.Net 7.0/7.1では事実そのようになる。

しかし,フォームに関してはForm1で「暗黙のインスタンス」を使えるという特例があります。
このため,
Form1.test = "成功"
はForm1クラスの暗黙のインスタンスのtestフィールドに"成功"という文字列を代入するコードになります。
ところが,画面に表示されるウィンドウはForm1クラスの暗黙ではないインスタンスです。
そのため,testフィールドは別のものになります。

解決方法は,testの引数にForm1を受け取り,そのインスタンスのtestに代入するように変更することです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!