- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:自殺プログラム-自らunload するfrm)
自殺プログラム-自らunload するfrm
このQ&Aのポイント
- 自殺プログラムの作成に成功しました。
- タイマー条件付きのMsgBox関数モドキの作成に成功しました。
- MsgBoxModoki.frmの命令や検索語についての知識がありません。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
1.タイマ処理のことでしょうか?違ってたら回答にならないのですが、 Timerオブジェクトを使用してタイマイベントを発生させ、そのイベントメソッド内で処理を記述する。 (Timerオブジェクトでヘルプ検索) 2.MsgBoxModoki.frm が発行する命令という解釈で、 "Unload Me" (そういうことを質問されているのではないですか?) ※見当違いなことをいってたら無視してください。
お礼
Unload Me 等Unload の処理は Form_QueryUnload() Form_Unload() Form_Terminate() の順番で発生するようです。 Unload()の処理中に Sub Form_QueryUnload(適当に) if (タイマー処理フラグ) then 強制終了フラグ = True Cancel = 1 end sub Sub Form_Unload() Timer.Enabled = False: 'Timer動作停止 end sub Sub Timer_Timer() if (タイマー処理フラグ) then exit sub タイマー処理フラグ = True call 適当な処理 タイマー処理フラグ = False if (強制終了フラグ) then Timer.Enabled = False: 'Timer動作停止 unload Me end if end sub Sub 適当な処理 do call 適当にpingの実行 DoEvents if (強制終了フラグ) then Call TCP/IPの終了処理: exit do loop (ping が通るまで待つ) end sub のように 1.Unloda処理ルーチン内でタイマーが動作している場合(Sub 適当な処理内DoEventの処理としてUnload処理が開始された場合)にはunloadを中断し、強制終了フラグを立てる 2.タイマー処理ルーチン内で強制終了フラグを見て処理を中断し 3.タイマー処理内に戻ったところでタイマーを終了して 4.再度unload が実行されるのをひたすら待つ。自らunload できる場合があるのでunload を一応かけておく。 5.unloadが失敗することがある(TCP/IPの終了処理が失敗した場合など)ので親formでもう一回unloadを実行する(TCP/IPが正常終了したことを信じで) の処理が必要なようです。 特権命令を使える普通のマルチタスクならば、タイマー処理であろうとも何であろうとも特権命令を自ら実行する(一般ユーザーであっても自分自身に対しては特権命令が実行可能)のですがWindows では終了命令を自ら検出して正常終了する必要があるようです。これでは、ハングアップが多いのも納得できます。 それらしきソフトが完成しました。なおSP5を使用しています。SP6ではTCP/IPサーバーソフトが動きませんので。
補足
6割がた解決しました。 終了処理関係の情報がわかりません。 Timer処理内ルーチンで事象待ち状態(例.DNSにアクセスし接続先IP番号を決定するまでの最大20秒間, 相手先IPにECHOを送り応答があるまでの約0.3秒*4回等)にあるときに 左上「X」を使用した強制終了をオペレーターが命じるとUnload等のルーチンに移動します。 Unload 内で Timer1.E(なんとか)=Faile を実行してもTimer処理ルーチンの最後のExit sub又はEnd SUb が実行されるまで処理が継続します。終了処理として関係ファイルのClose等を先に実行してしまう等の関係でエラー処理から無限ループに陥ってイます。 結果としてUnload後もTimer処理ルーチンが生き残っています。親FormからのUnload命令でもTimer処理が停止しません。適当なところでV.B.の実行をブレークポイントでとめて追跡した結果いじょうの内容が判明しました。 待ち状態にないのであれば簡単にとまります。