[Protra-members] Re: 不具合「ログの表示が一定量で止まってしまう」について

Zurück zum Archiv-Index

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のアドレスが格納されている?


長々と説明してしましたが、またご教示願います。






Protra-members メーリングリストの案内
Zurück zum Archiv-Index