牛、豚、鶏、どれか一つ食べられなくなるとしたら?

言語 Visual Basic 6.0(SP5)

自殺プログラム-条件が成立したら自分自身を消去するプログラム-として
タイマー条件付 「MsgBox 関数」モドキを作りたい(実際に作る内容はオーバーレイプログラムとして通信関係資源を含む外部資源の操作等も含みます)のですが
経過時間表示をしない「MsgBox 関数モドキ」

タイマーで終了(unload)せず手作業が必須な「MsgBox 関数モドキ」(非表示には成功しました)

親frmまで殺す「MsgBox 関数モドキ」
の作成には成功しました。

MsgBoxModoki.Show

等で参照した MsgBoxModoki.frm が
1.手作業を伴わずに何かしらの表示を伴う手続きを実行する命令(ヘルプメッセージの検索用語すらわかりません)等
2.自らunloadするようにする命令等
ご存知の方いらっしゃいませんか。いらっしゃったらば命令や検索語をお知らせください。

A 回答 (1件)

1.タイマ処理のことでしょうか?違ってたら回答にならないのですが、


  Timerオブジェクトを使用してタイマイベントを発生させ、そのイベントメソッド内で処理を記述する。
  (Timerオブジェクトでヘルプ検索)

2.MsgBoxModoki.frm が発行する命令という解釈で、
  "Unload Me"
  (そういうことを質問されているのではないですか?)

※見当違いなことをいってたら無視してください。

この回答への補足

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.の実行をブレークポイントでとめて追跡した結果いじょうの内容が判明しました。

待ち状態にないのであれば簡単にとまります。

補足日時:2005/11/29 23:51
    • good
    • 0
この回答へのお礼

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サーバーソフトが動きませんので。

お礼日時:2005/12/30 23:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!