C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 56 を表示中)
■31744 / )  DBデータ読み込み時のマルチスレッド処理について
□投稿者/ pgm300 (3回)-(2009/01/28(Wed) 13:18:49)

分類:[C#] 

2009/01/28(Wed) 13:20:06 編集(投稿者)

OS: Vista Business
IDE:VS2008
言語:C#
形態:Windows Form

こんにちは。

マルチスレッドプログラミングについて質問させてください。

良くサンプルにあるSystem.ThreadingのThreadクラスを用いて、
DBからデータ読み込み中に、フォームのプログレスバーをインクリメント
させて、処理しています(フリーズしていません)という感じにしたいのです。

コードとしては、Thread.Startを用いており、確かにスレッドは
出来ているが、当方の希望する動きになっていないのです。

具体的に言いますと、
処理として
1. ループとThread.Sleepを用いて、1秒おきにProgressバーの
  値をインクリメントする処理。
2. DBからデータを読み込む処理

1と2は別スレッドになります。

2の処理は、DBからデータを読み込むのに、約30秒かかります。

処理の流れとしては、

@スレッド作成・開始
ADB読み込み ← System.Data.OracleClientを使用しています。
Bスレッド処理停止

となっていますが、各処理にConsole.WriteLineで処理開始・終了時刻を
出力するようにして、実際にデバッグすると、
希望としては

@00:00:00
A00:00:01
@00:00:01
@00:00:02
@00:00:03
@00:00:04
(省略)
A00:00:30

というようにDB読み込み中にもスレッドが規則正しく動き、
プログレスバーのインクリメントを期待していたのですが、
実際には、

@00:00:00
A00:00:01
A00:00:30
@00:00:01
@00:00:02
@00:00:03
@00:00:04

というように、DB読み込みの処理に移ると、メッセージキューには
確かに書き込まれているようですが、DB読み込みが完了と同時に
(上記の図でいくと、@の後ろ4つが)
一気にメッセージが処理されてしまうような動きになっています。

ですので、はじめの1回目のインクリメントはされて、プログレスバーに
表示されますが、その後はDB読み込み完了後に、一気にインクリメント
され、全然意味のないプログレスバーになってしまっています。

この状態を回避したいと考えておりますが、ご存じの方がおられましたら、
相談に乗って頂けないでしょうか?

宜しくお願い致します。
返信 編集キー/


管理者用

- Child Tree -