Delphi:CreateProcess + WaitForSingleObject + DE = 15秒延迟

时间:2013-02-25 20:27:43

标签: delphi subprocess wait dde

我遇到了有趣的问题。

我有一个DDE客户端,它从DDE服务器读取一些值。 当我从Delphi启动此客户端,或者在exec上启用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秒的延迟。

我记录了客户端程序的时间,并使用此dde程序传递了15秒....

Delphi: DDE call from Indy TCPServer Thread

所以我不明白为什么WaitForS会在调用ddelcient.exe时导致速度问题?

主人的WaitForS如何减慢子进程'dde调用?

你对这个问题有所了解吗?感谢您提供任何信息,链接,建议!

1 个答案:

答案 0 :(得分:8)

DDE对窗口消息进行操作。如果调用线程接收到任何DDE消息(例如来自lauched进程但未处理它们),则调用WaitForSingleObject()可以在整个系统中阻止DDE。因此,您的15秒延迟可能是由于您的线程意外阻止了DDE操作,直到它在另一端超时。

您有几个选择:

  1. 让你的线程调用OleInitialize(),它会默默地为你处理DDE问题。

  2. 让您的等待代码使用MsgWaitForMultipleObjects()代替WaitForSingleObject(),以便您可以在等待时发送任何收到的消息。

  3. 使用ShellExecuteEx()而不是CreateProcess(),指定SEE_MASK_NOASYNC标志,因此操作系统知道调用线程没有消息循环来处理DDE消息。