「inetFTP」というフォームに Internet Transfer Control があります。電話したら
inetFTP.Execute , "Get " & "test.zip" & " " & "C:/test.zip"
ダウンロードが完了するまでコードの実行を一時停止したいので、後で問題が発生する可能性のあるファイルで他のコードが動作することはありません。それを行う方法はありますか?
通常は、コントロールのStateChanged
イベントを使用して、少なくとも状態icError
とicResponseCompleted
状態を監視します。
しかし、実際のプログラムでは、多くの場合、Timer コントロール、経過時間カウンター、およびキャンセル フラグと共にこれを使用する必要があります。タイムアウトを処理したり、長時間実行されている操作をキャンセルしたりするために、状態の変化を見逃さないようにする必要があります (それらがすばやく連続して発生した場合、イベントを発生させないように見えるものもあります)。
コントロールには、解決されていない長年のバグがいくつかあると思われます。そのため、StateChanged
期待するほど信頼性が高くありません。これの一部は、セッション指向の FTP プロトコルに固有の癖や競合状態に関連している可能性があります。HTTP 操作はかなり決定論的です。
そこから、Windows プログラムのモデルに適切に適合するようにプログラム フローを変更する必要があります。
長時間実行される非同期操作を開始することはできますが、ほとんどの場合、完了信号 (または中止など) を受け取るまでは、「実行する価値のある」ことしかありません。
そのため、Execute
実行しているイベント ハンドラーを終了します。完了が通知されたら、その完了イベント ハンドラーで処理を再開します。
VB6 は QBasic ではなく、Windows は DOS ではありません。
私は答えを見つけました。挿入すればいい
Do While inetFTP.StillExecuting
DoEvents
Loop
これは、Internet Transfer Control がジョブを完了するまでループします。
タイマー (VBA.DateTime.Timer) を使用できます。以下を参照してください。
Dim PauseTime As Single, start As Single
PauseTime = 2 ' pause the execution of code for two (2) seconds:
start = Timer
Do While Timer < start + PauseTime
DoEvents
Loop