プロが教えるわが家の防犯対策術!

同一フォーム上にTimer(Interval=1000)とCommandButtonを貼り付けCommandButtonをクリックするとMsgboxを表示するプログラムを作成しましたが、Msgboxを表示している間Timerイベントは動いていないようで、Msgboxを閉じると動き出すようようです。
これは仕様なのでしょうか。回避策または代替プログラムはあるでしょうか?
よろしくお願いします。

A 回答 (2件)

 仕様かバグかといわれたら、仕様だ。



 Visual Basic 6だろうと、VB.NETだろうとC#だろうと、普通にプログラムを作るとそれは「シングルスレッドアプリケーション」になる。

 シングルスレッドを簡単に説明すると、そのプログラム中で動作をしているポイントが1つしかないという事だ。
 もっと簡単に言えば、TimerイベントやCommandButton_Clickイベントは同時に一つしか呼ばれない。つまり、あるイベントが実行されている間、他のイベントが到達しても待機状態になっているわけだ。

 「じゃあマルチスレッドにしないといけないの?」
 MsgBoxで止まっている場合はその通り。この時、プログラムからは(Win32APIを駆使しない限り)別の処理を実行できない。プログラムが、完全に「MsgBox終了待ち」で止まっている。これを回避するには、メッセージボックスのようなフォームを自前で作り、それを表示するようにしないといけない。

 余談だが、MsgBoxで止まっている訳ではない場合、VB6も、VB.NETも、C#も、シングルスレッドの状態で複数イベントを同時に実行する機能を備えている。DoEventsというものだ。これに関してはネットなどで使い方を調べると良いだろう。前述の通り、MsgBoxで止まっている場合はこのDoEventsは使えない。
    • good
    • 0

Msgboxはモーダル(制御を離さない)なので仕様です。



どうしても似たようなことをしたければ、ユーザフォームで定義してcreateすれば可能かも。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!