質問者
マルチスレッドについて

質問
-
開発環境:VS2005、WindowsXPpro
お世話になっております。
非同期マルチスレッドの制作を初めて行うのですが、Code Snippetprivate void WvlsSDKView1_NoticeIO(object sender, AxWvlsSDKViewLib._DWvlsSDKViewEvents_NoticeIOEvent e)
{
if (e.mstat > 0)
{
MessageBox.Show("検地");
}Thread.Sleep(300);
}上記のメソッドを別スレッドにしたいと考えております。
http://www.stackasterisk.jp/tech/dotNet/csharp07_03.jsp
上記のWEBサイトのデリゲートを参考に、以下のコードを書いてみましたが詰まってしまいました。
Code Snippet//Invokeメソッドで使用するデリゲート
delegate void ThreadMethodDelegate(object sender, AxWvlsSDKViewLib._DWvlsSDKViewEvents_NoticeIOEvent e);
private void connectButton_Click(object sender, EventArgs e)
{
ThreadMethodDelegate threadMethodDelegate = new ThreadMethodDelegate(WvlsSDKView1_NoticeIO);
threadMethodDelegate.BeginInvoke(null);
}このコードをビルドすると、
エラー 1 引数を '1' 個指定できる、メソッド 'BeginInvoke' のオーバーロードはありません。
とエラーが出てしまいます。基本的なことが間違っているかもしれませんが、
皆様ご教授のほう宜しくお願いいたします。
すべての返信
-
外池です。
引数を三つにすべきはずです。(ドキュメントのどこかに書いてあったような・・・)
最初が、コールバックのためのDelegateを書くので今回の場合は「null」、
で、あと、「object sender」と 「AxWvlsSDKViewLib._DWvlsSDKViewEvents_NoticePictureEvent e」を並べれば良いはずです。
ただ、このように引数を並べてBeginInvokeを呼び出せる機能は、コンパイラーの機能のようです。(.Net Frameworkのライブラリーの機能ではない) 私は、Visual Basicでやってみた経験に基づいて申し上げていますが、おそらく、C#でも同じであろう、という前提があります。
-
Abstract様、外池様、有難うございます。
現在コードを以下のようにしてあります。
//Invokeメソッドで使用するデリゲート
delegate void NoticeIODelegate(object sender, AxWvlsSDKViewLib._DWvlsSDKViewEvents_NoticeIOEvent e);
private void connectButton_Click(object sender, EventArgs e)
{NoticeIODelegate NoticeIO = new NoticeIODelegate(WvlsSDKView1_NoticeIO);
IAsyncResult ar = NoticeIO.BeginInvoke(this, e, null, null);
}
private void WvlsSDKView1_NoticeIO(object sender, AxWvlsSDKViewLib._DWvlsSDKViewEvents_NoticeIOEvent e)
{if (e.mstat > 0)
{
MessageBox.Show("検知");
}
}ビルドをすると、
エラー 1 'infoCamera.mainForm.NoticeIODelegate.BeginInvoke(object, AxWvlsSDKViewLib._DWvlsSDKViewEvents_NoticeIOEvent, System.AsyncCallback, object)' に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。
エラー 2 引数 '2': 'System.EventArgs' から 'AxWvlsSDKViewLib._DWvlsSDKViewEvents_NoticeIOEvent' に変換できません。
というように表示されます。
何度も非常に申し訳ございません。 -
次のようにすると、どうでしょう?
NoticeIODelegate NoticeIO = new NoticeIODelegate(WvlsSDKView1_NoticeIO);
AxWvlsSDKViewLib._DWvlsSDKViewEvents_NoticeIOEvent e2 = new AxWvlsSDKViewLib._DWvlsSDKViewEvents_NoticeIOEvent();
IAsyncResult ar = NoticeIO.BeginInvoke(this, e2, null, null);恐らく上記コードで WvlsSDKView1_NoticeIO を非同期的に呼び出すことには成功すると思います。
(パラメータ無しのパブリック コンストラクタが定義されているならば)
しかし、……どうも不安です。mstat はどうなるのか。
常に 0 になりそうですけど。それともコンストラクタが自動的に適切な値を設定するのかな?
本当は AxWvlsSDKViewLib についてのマニュアル等があればよいのですが、
ちょっとネットを探しても見あたりませんでした。そもそも何の SDK なのでしょうか。あと、(マニュアルがないため)これはただの直感になりますが、
WvlsSDKView1_NoticeIO はライブラリが自動的に呼び出すのではないか、という気がします。