

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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) ACCESS DAO で不要なテーブルのフィールド(列)の削除 4 2022/06/23 12:13
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
Excelのエラーで困ってます。
-
HEWを使用しているのですが、こ...
-
ビルド失敗 指定されたファイ...
-
デバッグ中のエラーのことで教...
-
適切な変換関数が存在しない???
-
fortranでプログラムを実行する...
-
VB2008で定数に色の設定をした...
-
VBAでファイルを開くプログラム...
-
Arduinoに関する質問
-
windowsフォームアプリケーショ...
-
VB2010でのSQL日付フォーマ...
-
EXEファイルを作りたいが、途中...
-
ソースのおかしいところ
-
c言語をgcc.exeにコンパイルし...
-
VC++6.0からVC++2010への移行
-
フォームの作成中にエラーが発...
-
visual C++ でビルドの中止がで...
-
キーの自動入力
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
Excelのエラーで困ってます。
-
ビルド失敗 指定されたファイ...
-
fortranでプログラムを実行する...
-
visual C++ でビルドの中止がで...
-
適切な変換関数が存在しない???
-
VB2008で定数に色の設定をした...
-
HEWを使用しているのですが、こ...
-
コンパイルできません。
-
バッチからsqlplusの接続エラー...
-
Visual Studioのstrcpy_sについて
-
DLL関数を使ったプログラム
-
キーの自動入力
-
RightとLeft関数のライブ...
-
BC30002: 型 'ListItem' が定義...
-
LPCWSTRとchar
-
error C3867 関数呼び出しには...
-
デバッグ中のエラーのことで教...
-
sys/time.hのインクルードがで...
おすすめ情報