を実行して終了します。 実行している時間がかなり一致していたとして、これまでのところ、私は次のように満足してきた(2秒程度。):待ちは、私はマクロVBAからプログラムを起動していると私は私が行くとポストプロセス結果のデータをすることができます前に、それが実行して終了するのを待つ必要が
While FileLen(outputFilename) < 9000 And (Timer - Chrono) < 10
Wend
確かに私はすべての結果データを一度に、その前に書かれていることを観察しました、出力サイズは9Koを超えません。 とにかく、何らかの理由でプログラムの整合性が失われてしまったので、シェルプロセスが停止するのを待つクリーンなソリューションをもう少し見ました。 WaitForSingleObject
のアイデア、ShellAndWait
のモジュールが見つかりました。hereです。 This postは、私にいくつかの機能の発見に役立ったものです。
私の問題は、今のマクロは、シェルがまだ開いている間、動作して保持していることです。私が理解するところでは、WaitForSingleObject
は0を返します。これは、シェルが閉じられている(または実行が終了している)ことを意味しますが、そうではありません。
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const SYNCHRONIZE = &H100000
Public Const INFINITE = &HFFFF
Public Const PROCESS_ALL_ACCESS = &H1F0FFF
Sub launch()
analysisPath = "Path to the files to feed to the programm"
ShellCommand = "Program to run + arguments"
ChDrive ThisWorkbook.Path
ChDir analysisPath
fileID = Shell(ShellCommand, vbNormalFocus)
ProcHandle = OpenProcess(SYNCHRONIZE, False, fileID)
If ProcHandle<>0 Then
WaitRes = WaitForSingleObject(ProcHandle, INFINITE)
Else
MsgBox "Failed running Nastran"
End If
fileID = CloseHandle(ProcHandle)
End Sub
そしてWaitRes
がまだ0 アムIを上げる: より具体的には、ShellAndWait
に、
WaitRes = WaitForSingleObject(ProcHandle, DEFAULT_POLL_INTERVAL)
は、私はそれをビットを適合させることにより、コードの重要な部分を抽出する試み0 提起しますWaitForSingleObject
を使用して間違っている場合は、正しい方向に私を指すことができますか?
編集:それはまたthis postで受け入れソリューションでは動作しません(シェルの実行を意味するが、続けるために、マクロを停止しません)。私が実行している特定のプログラムのおかげで、それは奇妙な動作をするでしょうか?
メモ帳のように簡単に何かを呼び出そうとしましたか? – Charlie
メモ帳をシェルで実行しようとするとメモ帳が開き、メモ帳を閉じるまでマクロがフリーズします。私の場合の違いは、適切なアプリケーションのオープンがないということです。それはただのシェルのプロンプトです。それはコードがそれを理解する方法に違いをもたらすでしょうか? – BluK
はい私はWaitForSingleObjectが非常に特定の終了条件を探すと信じています。あなたのスクリプトが "失敗"したように見せて、WAIT_FAILEDを検出するためにスクリプトにSystem Exitを入れてみます。それは「成功」として登録するよりも簡単かもしれません。 – Charlie