sushi
sushi****@hkg*****
2005年 3月 11日 (金) 21:59:01 JST
ishiyakiimoです。 > 本来、スレッドからコントロールのメソッドを呼び出す場合、 > Invokeというメソッドを介して呼び出すべきだとされています。 > > http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpcondevelopingmultithreadedwindowsformscontrol.asp > > Invokeを使うようにして試してもらえますか。 > これは、勉強に時間がかかると思います。 > サンプルコードなどは、他のサイトを検索した方が楽かもしれません。 「コントロールのメソッド」というのは、 ログを1行づつ出力している this.AppendText(msg); の事ですよね。この処理AppendTextが処理している間は他の処理をしないように すればいいんですよね? http://ukamen.hp.infoseek.co.jp/Programming/Asyncro/ ここのBeginInvokeを使用する方法を見よう見真似でやってみました。 いろいろなサイト見て調べました。 ところがデリゲートの使用方法で詰まってしまって困っています。 手順: 1:SimulationTextBox.csのBuy関数のすぐ上に定義 public delegate void MyDelegate( string msg ); 2:buy()関数の中に定義 System.Windows.Forms.Control control; MyDelegate myDelegate = new MyDelegate(TextBoxBase.AppendText(msg) ); ★ object [] argss = { msg }; // デリゲートを BeginInvoke で起動する。 IAsyncResult ar = control.BeginInvoke( myDelegate, argss ); // シグナルを待つ。 ar.AsyncWaitHandle.WaitOne(); if (ar.IsCompleted) { Console.WriteLine("Completed"); // EndInvoke で結果を得る。 object obj = control.EndInvoke(ar); } 上記のコードを追加しましたが、エラーが出てしまいます。 ★マークの行で 「メソッド名が必要です」と、 「静的でないフィールド、メソッド、またはプロパティ 'System.Windows.Forms.TextBoxBase.AppendText(string)' で、オブジェクト参 照が必要です。」 と出ます。 AppendTextってメソッド名ですよね? 構文について教えていただきたいのですが、 「public delegate void MyDelegate( string myInt );」 ↑これによって、string形の引数を一つ持つ関数用のデリゲート型を定義したというこ とでしょうか? 「MyDelegate myDelegate = new MyDelegate(TextBoxBase.AppendText(msg) );」 ↑これによってmyDelegateという、無印C言語でいうところの「関数へのポインタ変数を 定義した」という事でしょうか? そしてmyDelegateの中には、TextBoxBase.AppendTextのアドレスが格納されている? 長々と説明してしましたが、またご教示願います。