- PR -

.netクラスライブラリの関数のスレッドを分ける

1
投稿者投稿内容
KenJames
会議室デビュー日: 2006/02/12
投稿数: 3
投稿日時: 2006-02-12 03:26
お世話になります。
私の環境は
WindowsXP ProSp2
VisualC# 2005 Express
です。

ファイルに対してある処理をする.netのメソッドがあるのですが、ファイルのサイズが大きくなると、処理中GUIがフリーズ気味になってしまいます。

FileStream fs = new FileStream(@"C:\temp.dat", FileMode.Open, FileAccess.Read);
//dotNet.Method()は.Netのあるクラスのメソッド
int data = dotNet.Method(fs);
fs.Close();

例えば上記のようなコードですと、C:\temp.datが例えば100Mbとか200Mb近いと、dotNet.Method(fs)が呼ばれた時に処理は続行されてますが、終わるまでGUIが固まってしまいます。
マルチスレッド化すればよいと思うのですが、どこでThread.Sleep()をすればいいかなど、いまいちやり方がわかりません。

解決法を教えてください。
よろしくお願いします。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-02-12 03:46
.NET 2.0 であれば、幸いなことに BackgroundWorker コンポーネントを使用することができます。
http://www.atmarkit.co.jp/fdotnet/vb2005/vb2005_04/vb2005_04_01.html
これが基礎的な解説です。


単純な内容であれば問題はあまりありませんが、マルチスレッドプログラムにはシングルスレッドプログラムにはない特有の問題を抱えます。
それらについてはこちらの記事が参考になるでしょう。
http://www.atmarkit.co.jp/fdotnet/mthread/index/index.html
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-12 09:26
引用:

KenJamesさんの書き込み (2006-02-12 03:26) より:

マルチスレッド化すればよいと思うのですが、どこでThread.Sleep()をすればいいかなど、いまいちやり方がわかりません。

解決法を教えてください。
よろしくお願いします。


 Thread.Sleep を呼ぶ必要がある?
 きちんと設計しましょう。GUI のスレッドは、処理をするスレッドを呼び出して、そのままメッセージループに戻ってしまえばいいでしょう。ファイル処理をするスレッドは、寝る暇も惜しんで処理をしましょう。終わったらイベントででも通知すればいいです。Thread.Sleep を呼び出す必要はありません。

〆 written by Jitta 2006/02/12
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-12 11:06
引用:

Jittaさんの書き込み (2006-02-12 09:26) より:

Thread.Sleep を呼ぶ必要がある?


UI をある程度軽くするために必要な場合はありますね。
サイクルが短くないとダメですけど、微少の停止をすることで改善する。

マルチスレッド化するにおいて、となると必要はなし。

# 「どこで呼べば」って、コード判らないのにどうやって教えればいいんだろう...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
KenJames
会議室デビュー日: 2006/02/12
投稿数: 3
投稿日時: 2006-02-14 10:16
こんにちは、返信遅れてすいません。
解決しました。
for(int i = 0; i < n; i++)
{
FileStream fs = new FileStream(@"C:\temp.dat", FileMode.Open, FileAccess.Read);
//dotNet.Method()は.Netのあるクラスのメソッド
int data = dotNet.Method(fs);
fs.Close();
}
となっていた部分を全部別スレッドに分けたら思うような動作になりました。
int data = dotNet.Method(fs);
マルチスレッドについて勉強不足ですた。
この部分だけを別スレッドに分けようとしておかしなことになっていました。
ありがとうございます。

1

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