- PR -

APL強制終了時のイベントの発生について

投稿者投稿内容
NiceDay
会議室デビュー日: 2006/10/02
投稿数: 18
投稿日時: 2007-09-26 09:39
投稿者です。
J.J. さんご回答ありがとうございました。
また、引き継いだ事を言い訳にして...設計自体に問題があると感じてきました(保守も大変です)。お知らせしておりませんでしたが(すみません)、この画面の切り替えなどにタイマーを使っていることもあり、タスクマネージャとタイマーイベントの間で、タスクマネージャでの強制終了の際にタイマーイベントがストップして「QueryUnloadイベント」でハンドリングできなかった、と言う風にも思ってきました。
とはいえ、設計の問題は、解決しなくてはならないと考えています。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-09-26 09:46
引用:

NiceDayさんの書き込み (2007-09-26 09:39) より:
タスクマネージャとタイマーイベントの間で、タスクマネージャでの強制終了の際にタイマーイベントがストップして「QueryUnloadイベント」でハンドリングできなかった、と言う風にも思ってきました。


そりゃそうでしょ。プロセス死んでいるのにタイマーだけ動くなんてVB6だけに限定すればありえない。

[ メッセージ編集済み 編集者: ぶさいくろう 編集日時 2007-09-26 09:46 ]
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-09-26 10:24
まず強制終了を強制終了されるアプリケーション内部でトラップすることは出来ません。したがって終了時に何らかの処理を行いたいのであれば、強制終了以外の方法で終了してください。

タスクマネージャから終了を行った場合、まず対象アプリケーションにメッセージが送られます。メッセージに対するアプリケーションの応答が無い場合、つまりUIスレッドがデッドロックしている場合には「応答なし」と表示され、強制終了をおこなうことになります。「応答なし」と表示されているということは、メッセージを処理できる状態に無いわけから、メッセージを受けたときのイベントの処理を書いても無駄です。

対策としては二通りあると思います。

ひとつはソフトAを呼び出す処理をUIスレッドとは別のスレッドに分離する方法。そうすればソフトAが異常をきたしてデッドロックしたとしても、UIスレッドは動作しているので、普通に終了処理を行えるはずです。

もうひとつはUIスレッドとは別のスレッドを作成し、別スレッドからUIスレッドが正常に動作していることを監視、動作に異常をきたしたなら終了処理を行う方法。UIスレッドに対して定期的にメッセージを送信。その応答を監視することで実現できるはずです。
NiceDay
会議室デビュー日: 2006/10/02
投稿数: 18
投稿日時: 2007-09-26 15:35
投稿者です。
甕星 さんご回答ありがとうございました。
スレッド分離についての再設計も必要だと思いました。
設計段階まで遡り検討していきたいと思います。

ありがとうございました。

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