- - PR -
スレッド処理について(C#)
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-09-06 19:25
現在作っているプログラムで、スレッド処理を考えています。
以下のソースプログラムがあるとします。 using System.Threading ; // for Thread private void button1_Click(object sender, System.EventArgs e) { Thread thread = new Thread(new ThreadStart(func1)) ; // スレッドの宣言 OtherForm oF= new OtherForm(); // ウィンドウ thread.Start() ; // スレッドの起動 oF.Show(); //threadの処理が重いため、フォームにて経過時間を表示する //★ここで threadが終了したのを確認したら、フォームoFを閉じる MessageBox.Show("Finish!"); } private void func_1() { /* スレッドの本体(重い処理)*/ } ----- 上の★の部分でどのようなコードを実装したら良いのか、分かりません。 どなたか御指南ください。 よろしくお願いします。 | ||||
|
投稿日時: 2005-09-06 21:55
Thread.Joinメソッドを使えばよいと思います。
| ||||
|
投稿日時: 2005-09-07 00:10
siaさん、ありがとうございます。
確かにThread.Joinを使うとうまくいきます。 このスレッドを実行している間、oFというフォームを表示させているのですが、このoFというフォーム上で、経過時間を表示したいと考えています。具体的にはフォーム上でラベルを設定して、そこに書き込むといったものです。 Thread.Joinはスレッドthreadが終了するまで、ロックされているため経過時間がうまく表示されないのです。つまり表示がロックされていて変わらない。 OSの仕様上仕方ないのでしょうか?? | ||||
|
投稿日時: 2005-09-07 09:01
こんにちは、じゃんぬ です。
Join メソッドのオーバーロードをよく確認してみてください。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemthreadingthreadclassjointopic2.asp _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2005-09-07 09:19
時間表示するスレッドをもう一個作って
about投げるとかはどーでしょう? | ||||
|
投稿日時: 2005-09-07 09:19
諸農です。
デリゲートを使ってフォーム上での表示処理と同期を取ればいいのでは? ただ結果的にスレッドの処理完了が遅くなると思いますが。 _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||
|
投稿日時: 2005-09-07 10:14
func1 の処理終了したらイベントを発生させてはどうでしょうか。
oF は生まれたときからひたすら時を刻み、End() で死ぬ。みたいな。 #編集 End は oF 内でもちろん定義する。 public void End(object sender, EventArgs e) [ メッセージ編集済み 編集者: 囚人 編集日時 2005-09-08 00:23 ] | ||||
|
投稿日時: 2005-09-07 18:54
ふと見直していて、気がついたのですが、Threadを使っているのが
すこし気になったりします。 特にスレッドの処理の中断を行わないでよいのなら、 非同期デリゲートをつかうことが推奨されているはずです。 #非同期デリゲートについてはBeginInvokeの使い方を調べてみてください。 で、肝心の処理の終了待ちですが、 BeginInvokeで返ってきたIAyncResultをEndInvokeで待てばよいのですが、 やはりロックされてしまいます。 ロックされないように&このメソッド内で処理をどうしても完結させたい場合は IAyncResult.IsCompleted で終了判定のポーリング用ループを回し、 Application.DoEvents(); でメッセージのディスパッチを起こせばとりあえず動作させることはできます。 #ものすごく非効率的なので注意ですが。 |