VB2005 の初心者です。
スレッドに Byref の引数を渡すやり方が分かりません。
Byval だとエラーは出ないのですが、
Byref だとどうしてもエラーが消えません。
ソースは下記です。
Private CDFAs clsCDF
Public Class clsCDF
Public LOOP1As clsLoop1
Public LOOP2 As clsLoop2
End Class
Protected Overrides Sub OnStart(ByVal args() As String)
Thread = New Thread(AddressOf ABC)
Thread.Start(CDF)
End Sub
Private Sub prvABC ( ByRef CDF As Object )
End Sub
何かヒントになることでも良いので、
皆様の知恵をお借りできれば幸いです。
よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
Threadクラスのコンストラクタは,任意のデリゲートを引数にとるわけではありません。
http://msdn2.microsoft.com/ja-jp/library/system. …
にあるように,
・ThreadStart型のデリゲート (引数無し,戻り値無し)
・ParameterizedThreadStart型のデリゲート (引数Object,戻り値無し)
の2種類のデリゲートしか扱えません。
任意のデリゲートで行いたい場合,BeginInvokeを使ったデリゲートの非同期呼び出しが適しています。
この場合,ByRefも引数に使うことができます。
http://msdn2.microsoft.com/ja-jp/library/2e08f6y …
一般用途で,ThreadクラスをNewしてスレッドを作成する必要は,ほとんど無いと思います。
・GUIがからむならBackgroundWorker
・そうでないならデリゲートの非同期呼び出し
で大抵は事が足りるからです。
# 非同期I/Oもデリゲートの非同期呼び出しの応用になりますし……。
ちなみに,デリゲートを経由して呼ばれるメソッドの可視性は一切気にする必要はありません。
PrivateだろうがPublicだろうが,デリゲートを経由した途端,可視性を無視して呼び出し可能です。
# だからイベントハンドラがPrivateになる。
詳しい情報、本当にありがとうございます。
実は、サービスのプログラムを作成しているのですが、
Thread の代わりに BeginInvoke を使ったデリゲートの非同期呼び出しにしたらエラーになってしまいました。
しかし、Thread のまま ByVal で引数を渡したところ、正常に動くことが分かりました。
値を変更するような ByRef の引数でも、Object型ならByValで動くのでしょうか??
それとも、VB2005では、ByVal も ByRef と同じ動きをするのでしょうか??
よく分かりませんが、とりあえず目的通りの動きが確認できたので良かったです。
貴重なアドバイス、ありがとうございました。
No.2
- 回答日時:
スレッド起動されるプロシージャ[prvABC ]が
Privateなのはまずいと思う。
ヘルプのサンプルではPublicになっています。
ご意見、ありがとうございました。
ANo.3 の回答へのお礼に記載しましたとおり、値を変えるような引数でもByValで渡すことができることが分かりました。
お騒がせしましたが、本当にありがとうございました。
No.1
- 回答日時:
どのようなエラーが出ているのか投稿しましょう
コンパイル時のエラーなのか実行時のエラーなのか
エラーの詳細は取得出来ているのか
コンパイル時の型不一致エラーなら Objectによる遅延バインディングをしないように Option Strict On などになっている可能性があります
この回答への補足
早速の返答、どうもありがとうございます。
説明不足で申し訳ありません。
エラー内容(コンパイルエラー)は下記のとおりです。
'Public Sub New(start As System.Threading.ParameterizedThreadStart)':
メソッド'Private Sub prvABC(ByRef CDF As Object)' と同じシグネチャがありません。
'Public Sub New(start As System.Threading.ThreadStart)':
メソッド'Private Sub prvABC(ByRef CDF As Object)' に、デリゲート 'Delegate Sub ThreadStart()'
と同じシグネチャがありません。
Option Strict Off にしても駄目でした。
何か更にご存知でしたら教えていただければ幸いです。
よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python エラー
-
Excelのエラーで困ってます。
-
ERROR C2660について
-
デバッグ中のエラーのことで教...
-
VC++2005でLAPACKを使用する...
-
「マクロが再定義されました」...
-
VisualStudio2010にて.NETプロ...
-
エクセルのエラーメッセージ「4...
-
C++でscanfは使えない?
-
新版 明解 C++ 入門編 につ...
-
RightとLeft関数のライブ...
-
error C3867 関数呼び出しには...
-
ウィンドウのハンドルからファ...
-
fortranでプログラムを実行する...
-
レコードセットをcloseする所で...
-
UNIX-Cのsystem関数でエラーを...
-
エラー 'iostream.h' : No su...
-
バルーンヘルプについて
-
ビルド失敗 指定されたファイ...
-
バッチからsqlplusの接続エラー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
Excelのエラーで困ってます。
-
適切な変換関数が存在しない???
-
fortranでプログラムを実行する...
-
バッチからsqlplusの接続エラー...
-
HEWを使用しているのですが、こ...
-
VB2008で定数に色の設定をした...
-
デバッグ中のエラーのことで教...
-
Handlesについて
-
Visual Studioのstrcpy_sについて
-
visual C++ でビルドの中止がで...
-
sys/time.hのインクルードがで...
-
ビルド失敗 指定されたファイ...
-
ビルドが失敗してしまいます
-
コンパイルできません。
-
ACCESSのDate関数のエラー表示...
-
RightとLeft関数のライブ...
-
BC30002: 型 'ListItem' が定義...
-
LPCWSTRとchar
おすすめ情報