2013-02-25 129 views
3

我遇到了一個有趣的問題。Delphi:CreateProcess + WaitForSingleObjects + DDE = 15秒延遲

我有一個從DDE服務器讀取一些值的DDE客戶端。 當我從Delphi啓動這個客戶端時,或者在exe上使用dblclick時,結果立即出現。

但是:當我從Indy TCPServer的線程或主應用程序啓動它時,我得到了15秒的延遲。

我用這個代碼啓動子:

function StartAndWaitProcess 
    (CmdLine : string=''; 
    CmdShow : integer = SW_SHOW; 
    TimeOut : longint = -1) : Int64; 
var 
    SInfo: TStartupInfo; 
    PInfo: TProcessInformation; 
    ExitCode : Cardinal; 
begin 
    Result := -1; 
    FillChar(SInfo,SizeOf(TSTartupInfo),0); 
    with SInfo do begin 
     cb := sizeof(TStartupInfo); 
     dwFlags := STARTF_USESHOWWINDOW; 
     wShowWindow := CmdShow; 
    end; 
    if not CreateProcess(nil, PChar(CmdLine),nil,nil,False, 
     NORMAL_PRIORITY_CLASS,nil,nil,SInfo,PInfo) then Exit; 
    if TimeOut > 0 then begin 
     if WaitForSingleObject(PInfo.hProcess, TimeOut) <> WAIT_OBJECT_0 then begin 
      TerminateProcess(PInfo.hProcess, 0); 
      Exit; 
     end 
    end else begin 
     WaitForSingleObject(PInfo.hProcess, INFINITE); 
    end; 
    GetExitCodeProcess(PInfo.hProcess, ExitCode); 
    Result := ExitCode; 
end; 

對我來說有什麼奇怪?

如果我不等待結束,那麼子程序運行時的性能與我在正常應用程序中運行時相同,因此我立即得到結果,並且窗口消失得很快。

但是,如果我等待客戶端的主人,我得到了15秒的延遲。

我登錄客戶端程序的時間,而15秒的傳遞與此DDE程序....

Delphi: DDE call from Indy TCPServer Thread

所以我不明白爲什麼WaitForS導致上調用ddelcient速度問題。可執行程序?

大師的WaitForS如何減緩子進程的dde調用?

你對這個問題有一些想法嗎?感謝您的任何信息,鏈接,建議!

回答

8

DDE對窗口消息進行操作。調用WaitForSingleObject()可以在整個系統中阻塞DDE,如果調用線程收到任何DDE消息,例如來自激活的進程但不處理它們。所以15秒的延遲可能是由於你的線程意外地阻塞了DDE操作,直到它在另一端超時。

您有幾種選擇:

  1. 讓你的線程調用OleInitialize(),這將默默地爲你處理DDE問題。

  2. 讓你的等待代碼使用MsgWaitForMultipleObjects()而不是WaitForSingleObject(),這樣你就可以在等待時發送任何收到的消息。

  3. 的使用ShellExecuteEx()代替CreateProcess(),指定SEE_MASK_NOASYNC標誌,讓OS知道調用線程沒有消息循環來處理DDE消息。

+2

+1非常好的答案 – 2013-02-25 22:14:57