全ての処理を終わらせてから終了するプログラムを作成しています。
そこで下記のようなサンプルを作って試してみました。
(タイマのIntervalは1000です)
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If Not pvboolCloseFlag Then
tmrClose.Enabled = True
Cancel = True
End If
End Sub
Private Sub tmrClose_Timer()
lblClose.Caption = CStr(CInt(lblClose.Caption) + 1)
If CInt(lblClose.Caption) > 15 Then
tmrClose.Enabled = False
pvboolCloseFlag = True
Unload Me
End If
End Sub
別のプログラムからこのプログラムにSendMessage(hWnd, WM_CLOSE, 0&, 0&)を
送った時には問題なく15秒後に終了できますが、
タスクマネージャーからタスクの終了で終了した時には、5秒後に
"このプログラムは応答していません"のダイアログが表示されてしまいます。
このダイアログを表示したまま10秒たつとダイアログは自動的に閉じて
プログラムも終了しますが、ダイアログが表示されないようにしたいのです。
終了処理の仕方が間違っているのでしょうか
DoEventsが入ってないですね。
長い処理をするときは、こまめにDoEventsを呼び出すなりして、
Windowsに処理を返さないといけません。
この場合はどうかよくわかりませんけど、
適度にDoEventsを呼び出していれば、応答していることになると思うので、
ダイアログは出ないはずです。
DoEventsは関係ないでしょう。
タイマー処理で時間を計測しているのですから。
結局のところ,タスクマネージャがWM_CLOSEを発行後,
5秒間経ってウィンドウが消えなければ応答無しとして処理しているようです。
なので,15秒経つまで消えないプログラムは「応答無し」とされるのは仕方がないでしょう。
結局の所,仕様とするしかないと思います。
たかみちえさん、YuOさん
早速の回答ありがとうございます。
この質問を掲示板に書く前にこちらでも、もしかしてと思い
DoEventsをサンプルプログラムに入れて試したのですが
状況は変わらなかったので、質問のサンプルプログラムからは
DoEventsをはずしました。
YuOさんのおっしゃる通り仕様と思うことにします。