dur*_*ara 3 delphi subprocess dde wait
我遇到了有趣的问题.
我有一个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;
Run Code Online (Sandbox Code Playgroud)
对我来说有什么奇怪的?
如果我不等待结束,那么子进程运行时的性能与我从普通应用程序运行它时的性能相同,所以我立即得到了结果并且窗口快速消失.
但如果我等待客户端从主人那里结束,我有15秒的延迟.
我记录了客户端程序的时间,并通过此dde程序传递了15秒....
Delphi:来自Indy TCPServer Thread的DDE调用
所以我不明白为什么WaitForS会在调用ddelcient.exe时导致速度问题?
主机的WaitForS如何减慢子进程的dde调用?
你对这个问题有所了解吗?感谢任何信息,链接,建议!
DDE对窗口消息进行操作.WaitForSingleObject()
如果调用线程接收到任何DDE消息(例如来自lauched进程但未处理它们),则调用可以在整个系统中阻止DDE.因此,您的15秒延迟可能是由于您的线程意外阻止DDE操作,直到它在另一端超时.
你有几个选择:
让你的线程调用OleInitialize()
,它会默默地为你处理DDE问题.
等待使用等待代码MsgWaitForMultipleObjects()
,WaitForSingleObject()
以便在等待时发送任何收到的消息.
使用ShellExecuteEx()
而不是CreateProcess()
指定SEE_MASK_NOASYNC
标志,因此操作系统知道调用线程没有消息循环来处理DDE消息.