処理が終わった後にフラグをおろしてダイアログを閉じる処理を作りたい。そこで以下のようなコーディング
を行ったのですが、Debugモードでは期待通りの動作をしてくれたものの、
Releaseモードでは、操作禁止ダイアログが表示されたままになりました。
この問題についての指摘とアドバイスを下さい。宜しくお願いします。
public Boolean bThreadFlag = false;
private Thread mtestThread;
private void startThread(){
bThreadFlag = true;
mtestThread = new Thread(new ThreadStart(testRun));
mtestThread.SetApartmentState(ApartmentState.STA);
mTestThread.Start();
}
private void testRun{
//ダイアログ表示
while(bThreadFlag){
//処理中
}
//ダイアログ終了
}
private void プログラム計算処理(){
//外部とのやり取りをする処理
//フラグを落とす
bThreadFlag = false;
}
http://msdn.microsoft.com/ja-jp/library/aa289523(v=vs.71).aspx#vbtchusingthreadsanchor7
このあたりを参考に
ループの場所で
System.Windows.Forms.Application.DoEvents();
とかで、明示的に他のイベントを発生可能なようにしてやらないと
駄目だったはずです。
デバッグモードのときは、デバッグする必要性があるので
そういうのを入れなくてもイベントが発生するようになってるので
動作してるんだと思います。
処理を別スレッドで行うとき、
ユーザインターフェースの操作を
そのスレッドで行うべきではありません。
この場合であれば Testrun は別スレッドとなるので、
testrun 内でユーザインターフェースに関する操作を行うべきではありません。
これは基本事項です。
別スレッドで処理中に何も操作をできないようにするのなら
別スレッドで処理を開始する前、
この例で言うなら startThread メソッドの
mTestThread.Start();
の手前で別に作成した閉じることのできないフォームを表示し、
別スレッドでの処理が終わるまで待機します。
別スレッドでの処理が完了したら表示したダイアログをとじます。
別スレッドでの処理と終了までの大気については
http://msdn.microsoft.com/ja-jp/library/ms228969(v=VS.90).aspx
この項目を読めばよいと思います。
おおざっぱにぱっと考えたことを書いたので
きちんと動く物を作るにはもうすこし苦しんでもらうことになるかもしれません。
ただ、処理中に何もできないようにするのなら、
あえて別スレッドにする必要はないかと思います。
// ユーザが閉じることのできないダイアログを表示
// なにか処理
// 表示したダイアログを表示
だけでいけるのではないでしょうか。