- PR -

【C#】タスクマネージャから終了した際の後処理

1
投稿者投稿内容
96
会議室デビュー日: 2005/06/09
投稿数: 17
投稿日時: 2007-03-19 10:45
いつもお世話になっております。

Windowsアプリケーションで開発しています。
画面操作が出来なくなったような場合に後処理を行いたいのですが、
モーダル遷移とモードレス遷移で動きが変わってしまい困っています。

メニュー画面のボタンを押下し、モーダル遷移した画面を開いて、
作業中に画面操作が出来ない状態になるとします(画面が固まってしまう)。
その状態で、タスクマネージャからメニュー画面を選択し、タスクの終了ボタンを
押下するとプログラムの終了の画面が出てきます。

これがモードレス遷移の場合は、Closeイベントが発生して、後処理が出来ます。
イベントの中で、StackTraceからタスクマネージャからの処理だというのを判断してます。
モーダル遷移の場合は、イベントの発生が行われていないようです。
Closeイベントに入ってこない。(これが仕様?)

モードレス、モーダルで処理が変わってしまい、どのように処理すればよいのかわかりません。
モーダルで駄目なら、モードレスで開いて、モーダルっぽくみせるようにするしかないでしょうか??
その場合、メニュー画面に色々押せなくするような制御が必要になってくる為、
もっと簡単な方法があれば教えて欲しいです。

何かアドバイスあればお願いします。


<環境>
OS:WindowsXP
MSDE 2003
(.NET Framework1.1)
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-03-19 12:53
引用:

96さんの書き込み (2007-03-19 10:45) より:

Windowsアプリケーションで開発しています。
画面操作が出来なくなったような場合に後処理を行いたいのですが、
モーダル遷移とモードレス遷移で動きが変わってしまい困っています。



根本的な話として、画面操作ができない状態(固まった状態)にならないように
すべきではないでしょうか?

引用:

メニュー画面のボタンを押下し、モーダル遷移した画面を開いて、
作業中に画面操作が出来ない状態になるとします(画面が固まってしまう)。
その状態で、タスクマネージャからメニュー画面を選択し、タスクの終了ボタンを
押下するとプログラムの終了の画面が出てきます。



モーダルとモードレスの内部的な仕組みはわかりませんが、
たぶん正常な動作だと思います。<この辺詳しい人はツッコミお願いしますm(_ _)m

そして、一般的にはユーザがタスクマネージャで終了しようとするときは、
強制終了したいときでしょうから、正常な後処理は望むべきではないように思います。

画面が固まるというのはどういう状況でしょうか?
またやりたい後処理って何でしょうか?
本当に実現したい大きな目的の部分がわかれば、
もっと別の解決策/回避策もあるかもしれません。
96
会議室デビュー日: 2005/06/09
投稿数: 17
投稿日時: 2007-03-19 13:40
お返事ありがとうございます。


> 画面が固まるというのはどういう状況でしょうか?

まだ、調査中の段階ですが、マシンのスペックや他のアプリケーションを
起動中などによるような事が報告されています。まだ、特定の理由がない
ようです。


> またやりたい後処理って何でしょうか?

メニュー画面を開く際に認証処理を行っています。
同じユーザーでの起動は阻止している為、その条件で利用する情報(※1)を
処理したいのです。


> 本当に実現したい大きな目的の部分がわかれば、
> もっと別の解決策/回避策もあるかもしれません。

回避策として、必要な情報(※1)を処理してから起動処理に入るという方法も
あるのですが・・・。

現在、どのように処理をしていくのか検討中な状態なので、モーダル遷移とモードレス遷移の
仕様を調べてみて、無理そうなら回避策の方を提案してみたいと思います。
howfar
会議室デビュー日: 2007/03/16
投稿数: 14
投稿日時: 2007-03-19 14:40
強制終了なら、windowsのイベントですから、Closeイベントに入ってこないです。だから、このイベントをとりたければ、「win32 API」を使えば、実現できると思います、
下記手順やってみて
1.イベントを処理するファンクションを書く
2.win32APIを使って、windowsデフォルトイベント処理ファンクションアドレスを取って
3.「1」のファンクションのアドレスを取って(vbではaddressofで取って)
4.「2」のファンクションアドレスを「1」のファンクションアドレスで入れ替える

関係してるAPIはMSDNで探して、ちょっと忘れています、すみません。

**上記のアドレスはメモリのアドレスです

_________________
私は今日本語をべんきょうしていますが、だから日本語がうまくないですから、もし違うところがあったら、ご指導ください^_^
howfar.jp@gmail.com

[ メッセージ編集済み 編集者: howfar 編集日時 2007-03-19 14:42 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-03-20 11:22
引用:

howfarさんの書き込み (2007-03-19 14:40) より:

強制終了なら、windowsのイベントですから、Closeイベントに入ってこないです。


今回のご質問は、プロセスの強制終了ではなくて、ウィンドウの強制 Close のようです。
ウィンドウの強制 Close 時は、Form の Closing 系のイベントは発生します。

ただ、本当に応答なしの場合は、ウィンドウの強制 Close にはならず、
プロセスの強制終了になるような気がします。(なので、今回のような現象は不思議)

引用:

よねKENさんの書き込み (2007-03-19 12:53) より:

モーダルとモードレスの内部的な仕組みはわかりませんが、
たぶん正常な動作だと思います。<この辺詳しい人はツッコミお願いしますm(_ _)m


決して詳しいわけではありませんが... (と、先にお断りしておいて...)

Show メソッドの場合は、呼び出し先のフォームは独立して Taskmgr から管理されますが、
ShowDialog メソッドの場合は、呼び出し元のフォームだけで管理されます。

そもそも、ShowDialog メソッドの場合、ウィンドウを強制 Close しようとすると、
呼び出し元のフォームごと閉じられてしまいます。
つまり、「ShowDialog メソッドでは無理」 ということになると思います。

ただ、上にも少し書きましたが、Show メソッドでも運が良いと思っていた方が良いですね。
本当に Busy な状態であれば、プロセスごと消されることが多いです。

質問者さんの現象は 「応答なし」 ではないかもしれません。

引用:

根本的な話として、画面操作ができない状態(固まった状態)にならないように
すべきではないでしょうか?


もしくはやるべきことをやってから Form を表示すれば良いと思います。

おそらく、Load ~ Activated イベント間で Busy 状態になっているだけだと思います。
適宜制御を OS 側に返してあげるだけで、とりあえず安定しそうに思えます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-03-20 11:35
引用:

96さんの書き込み (2007-03-19 13:40) より:
回避策として、必要な情報(※1)を処理してから起動処理に入るという方法も
あるのですが・・・。


これが正解だと思う。

画面から操作を行えない状態と言うのは「意図していない異常な内部状態」と言うことですよね?意図していない異常な内部状態において、正常に終了処理を行える事を保障するのは、ほぼ不可能だと思います。仮にイベントを受け取れたとしてもね。

それに、プロセスの強制終了などイベントを受け取れない場合もありうると考えた場合、「必要な情報(※1)を処理してから起動処理に入る」と言う対策も行わざる得ないでしょう。
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
96
会議室デビュー日: 2005/06/09
投稿数: 17
投稿日時: 2007-03-20 14:53
howfarさん
情報ありがとうございます。
Win32 APIの使用方法などは知らなかった為、勉強になりました。
まだ、よくわかってませんが、ExitWindowsExあたりを使えば、
終了処理を制御できるようですね。(違ってたらご指摘お願いします。)

じゃんぬねっとさん
お返事ありがとうございます。
ご指摘の通り、私が検証した状況は「応答なし」という状態での話ではありません。
タスクマネージャからメニュー画面を選択してタスクの終了を行う事で同じような
状況を無理やり作りました。(本来は、こんな悪意のある操作はしないはずですが。)

クライアントが正常に終了しなかった場合での検証ですので、他にも想定しなければ
ならない状況は発生しますが・・・。
(タスクマネージャからプロセス終了した場合やシャットダウンをした場合など)

自分が断定できていない微妙な部分がわかり、感謝×2です。
↓(この部分)
> ただ、上にも少し書きましたが、Show メソッドでも運が良いと思っていた方が良いですね。
> 本当に Busy な状態であれば、プロセスごと消されることが多いです。

ShowでもCloseイベントが呼ばれない場合もあるわけですね。


甕星さん
お返事ありがとうございます。
じゃんぬねっとさんのご意見と合わせて考えると私も回避策の方が正解だと思います。

> 画面から操作を行えない状態と言うのは「意図していない異常な内部状態」と言うことですよね?

はい。そうです。異常な状態がどういう原因で発生するなどは特定できてないようなのですが、
開発者が意図していない状況であることは間違いありません。



回避策と考えていた方の処理を検討してみたいと思います。
皆様、どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)