gpt4 book ai didi

multithreading - 在线程中使用这段代码有什么问题吗? (德尔福)

转载 作者:行者123 更新时间:2023-12-03 15:22:44 25 4
gpt4 key购买 nike

我在线程中使用此代码(通过 Indy Onexecute 事件)。有什么问题吗?

function TFrmMain.ShellExecute_AndWait(FileName, Params: string): bool;
var
exInfo: TShellExecuteInfo;
Ph: DWORD;
begin
FillChar(exInfo, SizeOf(exInfo), 0);
with exInfo do
begin
cbSize := SizeOf(exInfo);
fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
Wnd := GetActiveWindow();
exInfo.lpVerb := 'open';
exInfo.lpParameters := PChar(Params);
lpFile := PChar(FileName);
nShow := SW_NORMAL;
end;
if ShellExecuteEx(@exInfo) then
Ph := exInfo.hProcess
else
begin
Result := true;
exit;
end;
while WaitForSingleObject(exInfo.hProcess, 50) <> WAIT_OBJECT_0 do
begin

end;
CloseHandle(Ph);
Result := true;
end;

最佳答案

MSDN有这样的建议:

Because ShellExecuteEx can delegate execution to Shell extensions (data sources, context menu handlers, verb implementations) that are activated using Component Object Model (COM), COM should be initialized before ShellExecuteEx is called. Some Shell extensions require the COM single-threaded apartment (STA) type. In that case, COM should be initialized as shown here:

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)

There are instances where ShellExecuteEx does not use one of these types of Shell extension and those instances would not require COM to be initialized at all. Nonetheless, it is good practice to always initalize COM before using this function.

(在 Delphi 中,您当然可以用 nil 替换第一个参数,并使用 or 进行按位运算。)

Raymond Chen 最近写了关于 the consequences of getting this wrong 的文章。具体示例是该函数可能会失败并显示 Error_Access_Denied 错误代码。

这是我在您的代码中看到的唯一潜在的多线程问题。下面是我在阅读您的代码时想到的更多事情,尽管它们与多线程无关(甚至与 Indy 没有太大关系)。

<小时/>

您有一种特殊的方式来等待程序停止运行。您一次重复等待 50 毫秒,但如果该过程尚未完成,您除了再次等待之外什么也不做。通过指定Infinite 超时来更准确地描述您的意图。

<小时/>

该函数始终返回True。如果没有有用的返回值,那么您应该将其设为一个过程,这样就根本没有返回值。不要用无用的信息来迷惑调用者。如果您要将其保留为函数,请使用 Delphi native 类型 Boolean 而不是 Windows 兼容类型 Bool 作为返回类型。

<小时/>

我对服务器在收到网络消息后执行用户交互程序的想法有点谨慎。

<小时/>

请注意,MSDN 表示您可能无法获得进程句柄。在某些情况下,ShellExecuteEx 无需创建新进程即可服务您的请求,因此您无需等待。

用户可能最终会使用该程序一段时间,而您的服务器将一直处于等待状态。我想知道是否真的需要等待。客户端是否也会等待服务器的响应?

关于multithreading - 在线程中使用这段代码有什么问题吗? (德尔福),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4310449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com