アプリ版:「スタンプのみでお礼する」機能のリリースについて

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


何かヒントになることでも良いので、
皆様の知恵をお借りできれば幸いです。
よろしくお願い致します。

A 回答 (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になる。
    • good
    • 0
この回答へのお礼

詳しい情報、本当にありがとうございます。

実は、サービスのプログラムを作成しているのですが、
Thread の代わりに BeginInvoke を使ったデリゲートの非同期呼び出しにしたらエラーになってしまいました。

しかし、Thread のまま ByVal で引数を渡したところ、正常に動くことが分かりました。

値を変更するような ByRef の引数でも、Object型ならByValで動くのでしょうか??
それとも、VB2005では、ByVal も ByRef と同じ動きをするのでしょうか??

よく分かりませんが、とりあえず目的通りの動きが確認できたので良かったです。
貴重なアドバイス、ありがとうございました。

お礼日時:2008/02/07 15:22

スレッド起動されるプロシージャ[prvABC ]が


Privateなのはまずいと思う。
ヘルプのサンプルではPublicになっています。
    • good
    • 0
この回答へのお礼

ご意見、ありがとうございました。

ANo.3 の回答へのお礼に記載しましたとおり、値を変えるような引数でもByValで渡すことができることが分かりました。

お騒がせしましたが、本当にありがとうございました。

お礼日時:2008/02/07 15:25

どのようなエラーが出ているのか投稿しましょう



コンパイル時のエラーなのか実行時のエラーなのか
エラーの詳細は取得出来ているのか

コンパイル時の型不一致エラーなら 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 にしても駄目でした。

何か更にご存知でしたら教えていただければ幸いです。
よろしくお願い致します。

補足日時:2008/02/04 19:07
    • good
    • 0

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