- PR -

スレッド処理について(C#)

投稿者投稿内容
shin2
ベテラン
会議室デビュー日: 2004/03/10
投稿数: 58
投稿日時: 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()
{
/* スレッドの本体(重い処理)*/
}

-----
上の★の部分でどのようなコードを実装したら良いのか、分かりません。

どなたか御指南ください。 よろしくお願いします。
sia
常連さん
会議室デビュー日: 2004/05/02
投稿数: 38
投稿日時: 2005-09-06 21:55
Thread.Joinメソッドを使えばよいと思います。
shin2
ベテラン
会議室デビュー日: 2004/03/10
投稿数: 58
投稿日時: 2005-09-07 00:10
siaさん、ありがとうございます。

確かにThread.Joinを使うとうまくいきます。

このスレッドを実行している間、oFというフォームを表示させているのですが、このoFというフォーム上で、経過時間を表示したいと考えています。具体的にはフォーム上でラベルを設定して、そこに書き込むといったものです。

Thread.Joinはスレッドthreadが終了するまで、ロックされているため経過時間がうまく表示されないのです。つまり表示がロックされていて変わらない。

OSの仕様上仕方ないのでしょうか??
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-07 09:01
こんにちは、じゃんぬ です。

引用:

shin2さんの書き込み (2005-09-07 00:10) より:

Thread.Joinはスレッドthreadが終了するまで、ロックされているため経過時間がうまく表示されないのです。つまり表示がロックされていて変わらない。

OSの仕様上仕方ないのでしょうか??


Join メソッドのオーバーロードをよく確認してみてください。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemthreadingthreadclassjointopic2.asp



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
paupau
会議室デビュー日: 2005/08/24
投稿数: 13
投稿日時: 2005-09-07 09:19
時間表示するスレッドをもう一個作って
about投げるとかはどーでしょう?
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-09-07 09:19
諸農です。

引用:

このスレッドを実行している間、oFというフォームを表示させているのですが、このoFというフォーム上で、経過時間を表示したいと考えています。具体的にはフォーム上でラベルを設定して、そこに書き込むといったものです。



デリゲートを使ってフォーム上での表示処理と同期を取ればいいのでは?
ただ結果的にスレッドの処理完了が遅くなると思いますが。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-07 10:14
func1 の処理終了したらイベントを発生させてはどうでしょうか。

コード:

private event EventHandler func1finish;

private void func1()
{
・・・
// 終わった。
func1finish(this, null);
}

private void button1_Click(object sender, System.EventArgs e)
{
・・・
func1finish += new EventHandler(oF.End);
oF.Show();
thread.Start();
・・・
}


oF は生まれたときからひたすら時を刻み、End() で死ぬ。みたいな。

#編集
End は oF 内でもちろん定義する。
public void End(object sender, EventArgs e)


[ メッセージ編集済み 編集者: 囚人 編集日時 2005-09-08 00:23 ]
sia
常連さん
会議室デビュー日: 2004/05/02
投稿数: 38
投稿日時: 2005-09-07 18:54
ふと見直していて、気がついたのですが、Threadを使っているのが
すこし気になったりします。

特にスレッドの処理の中断を行わないでよいのなら、
非同期デリゲートをつかうことが推奨されているはずです。
#非同期デリゲートについてはBeginInvokeの使い方を調べてみてください。

で、肝心の処理の終了待ちですが、
BeginInvokeで返ってきたIAyncResultをEndInvokeで待てばよいのですが、
やはりロックされてしまいます。

ロックされないように&このメソッド内で処理をどうしても完結させたい場合は
IAyncResult.IsCompleted
で終了判定のポーリング用ループを回し、
Application.DoEvents();
でメッセージのディスパッチを起こせばとりあえず動作させることはできます。
#ものすごく非効率的なので注意ですが。

スキルアップ/キャリアアップ(JOB@IT)