- - PR -
.netクラスライブラリの関数のスレッドを分ける
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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()をすればいいかなど、いまいちやり方がわかりません。 解決法を教えてください。 よろしくお願いします。 | ||||
|
投稿日時: 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 | ||||
|
投稿日時: 2006-02-12 09:26
Thread.Sleep を呼ぶ必要がある? きちんと設計しましょう。GUI のスレッドは、処理をするスレッドを呼び出して、そのままメッセージループに戻ってしまえばいいでしょう。ファイル処理をするスレッドは、寝る暇も惜しんで処理をしましょう。終わったらイベントででも通知すればいいです。Thread.Sleep を呼び出す必要はありません。 〆 written by Jitta 2006/02/12 | ||||
|
投稿日時: 2006-02-12 11:06
UI をある程度軽くするために必要な場合はありますね。 サイクルが短くないとダメですけど、微少の停止をすることで改善する。 マルチスレッド化するにおいて、となると必要はなし。 # 「どこで呼べば」って、コード判らないのにどうやって教えればいいんだろう... _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 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