2012-09-27 85 views
2

我正在尋找一個快速的替代CreateProcess在Delphi中執行exe中的某些計算,包括XML中的幾個返回值。 目前,我打電話給一個C#的具有特定參數的文件。其中一個電話需要約。 0.5s - 這是方式到昂貴,因爲這個EXE需要被稱爲幾百次(不幸的是,迭代調用,即多線程不會加快工作)。快速替代CreateProcess

我現在的代碼看起來像這樣(找到解決方案來獲取在StackOverflow上的exe somwhere的控制檯輸出)。

IsExecutable := CreateProcess(
      nil, 
      PChar(WorkDir + Exe + CommandLine), 
      nil, 
      nil, 
      True, 
      HIGH_PRIORITY_CLASS, 
      nil, 
      nil, 
      StartupInfo, 
      ProcessInformation); 
CloseHandle(StdOutPipeWrite); 
    if IsExecutable then 
     try 
     repeat 
      WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil); 
      if BytesRead > 0 then 
      begin 
      Buffer[BytesRead] := #0; 
      Result := Result + Buffer; 
      end; 
     until not WasOK or (BytesRead = 0); 
     WaitForSingleObject(ProcessInformation.hProcess, INFINITE); 
     finally 
     CloseHandle(ProcessInformation.hThread); 
     CloseHandle(ProcessInformation.hProcess); 
     end 

順便說一句,我不是很好的德爾福 - 其實,我覺得有點像「我不知道我在做什麼」狗米姆-事情...

回答

3

您是否需要每次都創建一個新流程?或者你可以重新使用同一個實例嗎?你可以使用一些低級別的控制檯輸入/輸出管道(你的代碼看起來像你現在要做的:)),或者你可以使用某種IPC(互斥+共享內存,在2之間複製數據)進程),或者您可以通過TCP/IP通信使用更多的n層(或客戶端/服務器)方法(RemObjects SDK對此非常有用,同時具有.Net和Delphi庫,它們通過TCP/IP進行通信,或windows消息,命名管道等)。然而,最後一種方法由於抽象而增加了一些延遲/開銷,但是比使用.Net和Delphi自己實現雙方更容易使用(這並不困難)。

+0

說到IPC,檢查www.cromis.net/blog/downloads/cromis-ipc/ –

8

創建新工藝昂貴。沒有其他選擇使用CreateProcess。這裏沒有快速修復。沒有任何魔法按鈕可以使工藝創建超快速。

您的問題的解決方案將是停止完全創建一個新的過程。在你的過程中執行這個任務。

+1

或者如果出於某種原因需要維護流程分離,請啓動一次並與其保持通信,因此您不必重複重新創建它(仍然會有開銷,但重要性更低)。 – Thomas

+0

@Thomas確實如此。雖然如此,進程可能是唯一的答案,但IPC可能很昂貴。如果計算足夠大,那麼IPC的成本可能變得微不足道。如果計算便宜,那麼IPC可能占主導地位。 –

1

什麼是緩慢的創造一個新的過程,並且更多的是每次運行可執行文件時啓動整個.Net框架過程。

爲了獲得最佳性能,您應該更好地將您的C#進程公開爲COM,然後直接從Delphi中調用它。

通過TCP/IP的遠程連接在這種情況下是不值得的,我想。幾年前,我在本地機器上使用RemObjects進行了糟糕的速度實驗。

你需要的是調用COM互操作,並且你可能感興趣的:

Delphi很好地處理COM對象,並且您可以很容易地從Delphi代碼中調用C#方法。

2

David wroteAndré wrote,你不能改變這一點。

這是真正的big differences between Windows and Linux之一。 Windows中的CreateProcess非常昂貴,而Linux中的fork很便宜。另一方面,Linux fork後面通常跟着昂貴的exec。這是爲什麼.NET introduced the AppDomain which is faster

有幾個方向可以將.NET代碼集成到您的流程中,如Arnaud wrote

您可以做的另一件事是在Delphi進程和.NET進程之間執行IPC(例如使用命名管道),並讓.NET進程爲每個請求使用AppDomains。

+0

fork沒有太多的用處,沒有exec –

+0

實際上它*是*很多服務器。 –

+0

這不是什麼在這裏發生,雖然 –

0

使用線程池還是IOCP?是的,這有點複雜和耗費資源,但不需要執行外部流程。新的線程池的API(Vista和更高版本),給你更多的機會和靈活性(你甚至可以標記爲長時間運行的任務):