none
マルチスレッドについて RRS feed

  • 質問

  • 開発環境:VS2005、WindowsXPpro

    お世話になっております。
    非同期マルチスレッドの制作を初めて行うのですが、

     

    Code Snippet

     

            private 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' のオーバーロードはありません。 
    とエラーが出てしまいます。

     

    基本的なことが間違っているかもしれませんが、

    皆様ご教授のほう宜しくお願いいたします。

    2007年8月22日 3:54

すべての返信

  • 外池と申します。

     

    単純なことのように見えますが、

     

    別スレッドで呼び出そうとしているメソッドは、二つの引数を要求しているわけですが、ところが、BeginInvokeには、コールバックが無し、ということでnullが指定されているだけで、引き渡すべき二つの引数が与えられていませんよね?

     

     

    2007年8月22日 5:08
  • アドバイス有難うございます。

     

    BeginInvokeのところを、

    threadMethodDelegate.BeginInvoke(object sender, AxWvlsSDKViewLib._DWvlsSDKViewEvents_NoticePictureEvent e);

    としてみましたが、

    エラー 1 'object' は無効です。 
    と表示されてしまいます。

     

    宜しくお願いいたします。
    2007年8月22日 5:24
  • 外池です。

     

    引数を三つにすべきはずです。(ドキュメントのどこかに書いてあったような・・・)

     

    最初が、コールバックのためのDelegateを書くので今回の場合は「null」、

     

    で、あと、「object sender」と 「AxWvlsSDKViewLib._DWvlsSDKViewEvents_NoticePictureEvent e」を並べれば良いはずです。

     

    ただ、このように引数を並べてBeginInvokeを呼び出せる機能は、コンパイラーの機能のようです。(.Net Frameworkのライブラリーの機能ではない) 私は、Visual Basicでやってみた経験に基づいて申し上げていますが、おそらく、C#でも同じであろう、という前提があります。

     

     

     

     

     

    2007年8月22日 6:13
  • この場合四つではないかと思います。

    threadMethodDelegate.BeginInvoke(this, e, null, null);

    これでよいのでは。もちろんこの場合の e の型は、

    AxWvlsSDKViewLib._DWvlsSDKViewEvents_NoticeIOEvent です。

    2007年8月22日 6:57
  • 外池です。

     

    すいません、確かに、4つですね。しかも、並べる順序、間違えていました。

     

    あと、DelegateのBeginInvokeの機能は、.Net Frameworkの機能ではあるようですが・・・、コンパイラー云々の話は、どこに書いてあったやら(不確実)

     

    詳しくは、MSDNドキュメントの、「.Net Framework開発者ガイド」の「同期メソッドの非同期呼び出し」が参考になると思います。

    2007年8月22日 7:10
  • 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' に変換できません。 

    というように表示されます。


    何度も非常に申し訳ございません。

    2007年8月23日 6:09
  • 次のようにすると、どうでしょう?

     

    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 はライブラリが自動的に呼び出すのではないか、という気がします。

    2007年8月23日 7:48