-PR-

解決済みの質問

質問:No.7504142
暇なときにでも
暇なときにでも
お気に入り投稿に追加する (0人が追加しました)
回答数1
閲覧数113
別スレッド上の変数を参照する方法について
VB2010で、別スレッドの変数をメインフォームが閉じられた時に
表示するプログラムを書いたのですが、変数の中身が空になってしまいます。
色々試してみたのですが、うまく値を参照できません。
別スレッド上の値をどうやったら参照できるのでしょうか?

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

'メインフォーム
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
投稿日時 - 2012-05-30 03:09:51

質問者が選んだベストアンサー

回答:No.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に代入するように変更することです。
投稿日時 - 2012-05-30 03:24:18
この回答を支持する
(現在0人が支持しています)
この質問は役に立ちましたか?
0人が「このQ&Aが役に立った」と投票しています
別のキーワードで再検索する
もっと聞いてみる

関連するQ&A

回答募集中

この他の関連するQ&Aをキーワードで探す

別のキーワードで再検索する
-PR-

OKWaveのおすすめ情報

特集

同じカテゴリの人気Q&Aランキング

カテゴリ
Visual Basic

回答のついた最新のQ&A

カテゴリ
Visual Basic

rss

situmonnsya

kumatti1

A_icon> tt = FindWindowEx(tw, 0&, ...2013-05-06 07:26:10

malonchan256

Q_iconVBAによるIE操作について2013-05-04 14:21:53

-PR-

ピックアップ

ノウハウ共有サイト

-PR-
-PR-