DOBON.NET DOBON.NETプログラミング掲示板過去ログ

常駐プログラムの終了について

環境/言語:[WindowsXP VB.NET NET Framework2.0]
分類:[.NET]

こんにちは。

常駐プログラムの終了について質問があります。

朝と夜の定まった時間に自動で起動と終了をするパソコンに、
作成した常駐プログラムをインストールしたのですが
ごく稀に、シャットダウン時にProgressBarの出ない
終了の確認ダイアログが出ます。
そのダイアログにより、パソコンがシャットダウンしません。

プログラムのどこが原因で、そのようになるかわかっていません。
動作としてはFTPからファイルを取得するプログラムなので、
FTP接続中、もしくは処理でスリープ(System.Threading.Thread.Sleep)を
使用しているので、そのタイミングにシャットダウンが掛かれば起きるのではと考えています。

しかし、プログラムが原因の場合は回避策がわかりません。。。。

対策、もしくは常駐プログラムの作成時に気をつけることありますでしょうか?
> 対策、もしくは常駐プログラムの作成時に気をつけることありますでしょうか?

ログオフやシャットダウンをしようとしている時にイベントを受け取る、
またキャンセルする
http://dobon.net/vb/dotnet/system/sessionending.html

この方法導入されてますか?

※ ここのサイトのTipsにありますので・・・

以上。
■No23986に返信(みけんにしわさんの記事)
> 対策、もしくは常駐プログラムの作成時に気をつけることありますでしょうか?

不具合の再現方法とか、中々難しそうな問題ですね。

直接的な回答では無いので申し訳ないのですが、Windowsが終了する際に各アプリ
に送られてくるメッセージを受けて、実行中のプログラム自身を正常に終了させる
様にされてみては如何でしょうか?

WM_QUERYENDSESSION    Windowsセッションを終了するよう要求します。 
WM_ENDSESSION            Windowsセッションが終了することを示します。 

※私はVBを触った事が無いので、サンプルコード等が書けなくてすみません(~_~;
オショウさん、まことさん返信ありがとうございます。

シャットダウンイベントを受け取ったあとに、どのような処理でダイアログが
出ないようになるのかがわかりません。。。。
(FTPなら強制的に切断する?スリープなら?知識不足で申し訳ないです。)

プログラム以外の方法から、対策を調べてみました。
1.
現在、自動終了時にはバッチによるシャットダウンコマンドを使用しているのですが
オプションで[-f]をつける。

2.
プログラムの自動終了の設定変更(レジストリ操作)
「フリーズしたプログラムの自動終了(時間)の設定」
HKEY_CURRENT_USER\Control Panel\desktop
文字列[AutoEndTasks]値[1]
文字列[HungAppTimeout]値[終了したい時間(秒)x1000]
文字列[WaitToKillAppTimeout]値[終了したい時間(秒)x1000]

プログラムからのアプローチはお二人のアドバイスを参考に、
考えながら確認してみたいと思います。
■No23990に返信(みけんにしわさんの記事)
> シャットダウンイベントを受け取ったあとに、どのような処理でダイアログが
> 出ないようになるのかがわかりません。。。。
> (FTPなら強制的に切断する?スリープなら?知識不足で申し訳ないです。)

これまた直接的な解法で無くて申し訳ないのですが、プログラムがどの様な状態の
時に件のダイアログがシステムから表示されるのかを先に調査した方がいいかも
知れません。

まずはシャットダウン時のイベントは抜きにして、FTP通信中やSleep中に故意に
シャットダウンのBATを実行して様子を見ては如何でしょう。

根本的な原因が分かれば、それに合わせた的確な回答・アドバイスが得られると
思います。

ちなみに「終了確認ダイアログ」を表示しているのはシステム側であって、実行中
のプログラムが普通に表示している訳では有りませんよね?(^^;
> シャットダウンイベントを受け取ったあとに、どのような処理でダイアログが
> 出ないようになるのかがわかりません。。。。
> (FTPなら強制的に切断する?スリープなら?知識不足で申し訳ないです。)

  非常に簡単な話・・・

  シャットダウンイベントを受け取ってしまったら、キャンセルしても
  終了処理が本当に中止されてしまうようなケースは、非常にまれです。

  よって、迅速に終了するしか無いのです。

  所定時間内に応答を返さない。もしくは終了しない場合にOS側が、
  アプリが終了しない由のダイアログを出してしまいます。
  どの程度の時間でそうなるかわ知りません。

  迅速に終了できるようなプログラム構造にする必要があります。

以上。
こんにちは。

まことさん、オショウさんレスありがとうございます。
こちら、返信が遅くなって申し訳ありません。

>ちなみに「終了確認ダイアログ」を表示しているのはシステム側であって、実行中
>のプログラムが普通に表示している訳では有りませんよね?(^^;
 → はい、OSの確認ダイアログです。

>所定時間内に応答を返さない。もしくは終了しない場合にOS側が、
>アプリが終了しない由のダイアログを出してしまいます。
>どの程度の時間でそうなるかわ知りません。
 → なるほど、参考になります。

>これまた直接的な解法で無くて申し訳ないのですが、プログラムがどの様な状態の
>時に件のダイアログがシステムから表示されるのかを先に調査した方がいいかも
>知れません。
 → 結局はここで原因を突き止めて、迅速に終わるような処理を考えてみます。

とりあえず、本件は「所定時間内に作成アプリが応答を返していない」と判断し、
解決にしようと思います。

その他、細かい原因がわかれば別途スレッドで質問するか、このスレッドを復活させたいと思います。

レスして下さった方ありがとうございました。

P.S
一点気になるのは、ProgressBarが出る時と出ない時でしょうか。。。
最悪、ダイアログが出てもProgressBarの出て時間がくれば終了してくれればよいのですが。。。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板