2019年12月25日水曜日

VB 外部プロセスと待機や終了

外部プロセス を起動する!
書き慣れれば、とても、便利ですね。
でも、後に続く 処理によっては、
留意すべき点があります。


LocalDB を使った DataBase プログラムでは厄介な事が生じます。
DataBase(以下 DB と省略)は自動で開いたり閉じられたりするのでしたね。
だから、該当ファイルを弄るには、LocalDB そのものを確実に止めなければいけません。
  参考: VB LocalDB ファイル操作 続編
同じ理由から、
外部プロセスで立ち上げた Robocopy のファイルコピーも気を付けないと。
特に、後続の作業が予定されている場合には 要注意 ですね。

外部プロセスでは、待機や終了 を考慮する必要があります。
協調させるのは、留意が不可欠なのですね。

最初は、単に、

  Dim p As New Process
  p.Start()

で突っ走っていました。

でも、もし、その直後で、Rename の必要性が生じれば ... 。
バックアップファイルをコピーし、それを改名する、 そんなシナリオです。

  Dim p As New Process
  p.Start()
  IO.FILE.Move(fileA, fileB)

バックアップは常に直近の1世代のみとし、
履歴を別フォルダに、日付をサブフォルダに取って、格納する心算です。

バックアップと現行データは、同一フォルダに置いています。

Debug していると、エラーが発生しました!。
あれぇ、間違っていない筈なのに ... 。

原因は、ファイルがコピー生成される前に改名しようとする事態に陥っていた事 ... 。

コードの通り、順番で実行される訳ではありません。
プロセスを立ち上げれば、実行は次に移り、
プロセスの実行結果が反映されるか否かは、別問題ですから。

そう、この1行を忘れていたのです。

  p.WaitForExec()

或いは、

  p.WaitForExec(5000)    ' 5s


私は良く Robocopy を別プロセスで立ち上げています。
大抵は、改名が直後に続く事は無く、
結果を画面表示させて、成り行きを確認しています。

何かで、大抵の Process 起動は 5s で賄えるのがベターと読んだ記憶があるのですが ... 。
長くなると想定される場合には、別途、検討が必要なのでしょう。.

でも、今回は、
例外発生させない対策さえちゃんと取れていれば、
自動実行が可能で、且つ、
表示した後で、別ウインドウを閉じるのも、自動化が可能な状況です。
例えば、こんな。  (随分と端折った例ですが ... )

  Dim p As New Process
  p.Start()
  p.WaitForExec(10000)    ' 10s
  p.kill()
  IO.FILE.Move(fileA, fileB)

この例で、結果の別ウィンドウが 10秒間 表示される訳では無い事に注意して下さい。
走り出してから消える迄が 凡そ 10秒間 です。
結果そのものが 10秒間 見れるでは無い事に留意です。
また、 起動した処理が 10秒で 終わるか否かは、また、別の問題なので、
闇雲に、数値を与えない方が良いのかも知れませんが ... 。  環境依存しますし。



0 件のコメント:

コメントを投稿