タスクマネージャからEXEを終了した時に"応答がありません"にならないようにするには

解決


はま  2002-10-25 15:02:23  No: 76274  IP: [192.*.*.*]

全ての処理を終わらせてから終了するプログラムを作成しています。
そこで下記のようなサンプルを作って試してみました。
(タイマの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秒たつとダイアログは自動的に閉じて
プログラムも終了しますが、ダイアログが表示されないようにしたいのです。
終了処理の仕方が間違っているのでしょうか

編集 削除
たかみちえ  URL  2002-10-25 16:45:33  No: 76275  IP: [192.*.*.*]

DoEventsが入ってないですね。
  長い処理をするときは、こまめにDoEventsを呼び出すなりして、
Windowsに処理を返さないといけません。

  この場合はどうかよくわかりませんけど、
適度にDoEventsを呼び出していれば、応答していることになると思うので、
ダイアログは出ないはずです。

編集 削除
YuO  2002-10-25 23:40:15  No: 76276  IP: [192.*.*.*]

DoEventsは関係ないでしょう。
タイマー処理で時間を計測しているのですから。

結局のところ,タスクマネージャがWM_CLOSEを発行後,
5秒間経ってウィンドウが消えなければ応答無しとして処理しているようです。
なので,15秒経つまで消えないプログラムは「応答無し」とされるのは仕方がないでしょう。
結局の所,仕様とするしかないと思います。

編集 削除
はま  2002-10-29 11:52:48  No: 76277  IP: [192.*.*.*]

たかみちえさん、YuOさん
早速の回答ありがとうございます。
この質問を掲示板に書く前にこちらでも、もしかしてと思い
DoEventsをサンプルプログラムに入れて試したのですが
状況は変わらなかったので、質問のサンプルプログラムからは
DoEventsをはずしました。
YuOさんのおっしゃる通り仕様と思うことにします。

編集 削除