実行中のサブルーチンを一時停止をするには?

解決


超初心者  2005-08-10 18:09:49  No: 124037

vb6を始めて3週間になります。

フォーム上の「スタート」ボタンを押して以下の処理がスタートしたとします。

private sub start()
  時間的に長い処理です。(sleep関数なども使用していて、長くなりがち)
end sub

この処理の実行中に、フォーム上の「一時停止ボタン」で、処理を一時停止させたいのですが、どうすればよいか分かりません。(ちなみに、もう一度「一時停止ボタン」を押したら、続きがやりたい。)今考えている方法がPGM的に難しい場合は、このような処理を解決できるその他のいい方法はないでしょうか?


・・・  2005-08-10 18:34:28  No: 124038

Dummyで何かファイルを作成して、
そのファイルが存在する場合には処理しない、などにしておく、とか


聖 羅樹  URL  2005-08-10 18:34:34  No: 124039

方法としてはいろいろあるかと。

まず、処理中に割り込みを入れるためには、
DoEvents が必要なのはお分かりですよね。
その上で、一時停止ボタンを押されたら、フラグを立てるなりして、
そのフラグが立っている間は、永久ループするような処理を
ところどころに入れておくとか。

While fPause
  Sleep(100)    ' CPU負荷を減らすため
  DoEvents      ' 割り込み可能とするため
End While

こんな感じで。
ならば、再度「一時停止」ボタンを押した時に、フラグをクリアすれば、
ループから抜けて続きが始まる、と。

ぱっと思いついた方法なので、
もっといい方法があるんだろうな・・・と思いながら投稿。


超初心者  2005-08-11 02:36:27  No: 124040

・・・さん、聖 羅樹さん ご意見ありがとうございます。

例えば、
 Sleep(10000)'10秒

を実行中に、6秒たったところで「一時停止」ボタンを押すして、再度そのボタンを押すと残りの4秒を実行することは可能でしょうか?(タイマーを使わないと無理でしょうか?)


K.J.K.  2005-08-11 04:19:01  No: 124041

意図的にはThreadやFiberが使えないVB6では、そういう構造は
やめるべきでしょう。1つ1つの処理を細かく分けて、都合に
応じて順次実行していく、という作りに改めるべきでは。


超初心者  2005-08-12 12:54:36  No: 124042

聖 羅樹さんに教えていただいた方法
 While fPause
   Sleep(100)    ' CPU負荷を減らすため
   DoEvents      ' 割り込み可能とするため
 End While

で解決できました。聖 羅樹さん、・・・ さん、K.J.K.さんありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加