2016-05-18 6 views
1

を実行して終了します。 実行している時間がかなり一致していたとして、これまでのところ、私は次のように満足してきた(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で受け入れソリューションでは動作しません(シェルの実行を意味するが、続けるために、マクロを停止しません)。私が実行している特定のプログラムのおかげで、それは奇妙な動作をするでしょうか?

+0

メモ帳のように簡単に何かを呼び出そうとしましたか? – Charlie

+0

メモ帳をシェルで実行しようとするとメモ帳が開き、メモ帳を閉じるまでマクロがフリーズします。私の場合の違いは、適切なアプリケーションのオープンがないということです。それはただのシェルのプロンプトです。それはコードがそれを理解する方法に違いをもたらすでしょうか? – BluK

+0

はい私はWaitForSingleObjectが非常に特定の終了条件を探すと信じています。あなたのスクリプトが "失敗"したように見せて、WAIT_FAILEDを検出するためにスクリプトにSystem Exitを入れてみます。それは「成功」として登録するよりも簡単かもしれません。 – Charlie

答えて

0

だから、私が探し保ち、私が働いていたコードのビットを発見しました。 私は実際にそれを見つけたhere

関連する問題