我有一个希望很快得到回答的问题:是否可能稍微延迟ShellExecute的执行?
我有一个包含自动更新程序的应用程序。在它下载所有必要文件等后,将当前文件重命名为*.OLD,新文件作为前一个文件。非常简单。但是然后我需要删除那些.OLD文件。这个“清理”过程在MainForm.OnActivate上执行(检查是否为第一个激活进程)。但是这显然发生得太快了(我从DeleteFile中得到False)。这是该过程:
procedure TUpdateForm.OKBtnClick(Sender: TObject);
const SHELL = 'ping 127.0.0.1 -n 2';
begin
ShellExecute(0,'open',pchar(SHELL+#13+Application.ExeName),nil,nil,SW_SHOWNORMAL);
Application.Terminate;
end;
这个程序旨在重新启动应用程序。我确信删除问题是由第二个应用程序的快速启动引起的,因为如果我自己重新启动它,并给予一点时间,文件就可以正常删除。
简短版本:我需要调用ShellExecute(),等待一段时间(大约0.1秒),然后执行命令。
注意:我尝试使用-ping命令来延迟它,但它没有起作用。
非常感谢您的帮助。
编辑:重新表述
我需要这样的操作||第一个应用程序关闭;等待100毫秒;打开第二个应用程序||。我需要先调用ShellExecute,然后等待调用应用程序完全关闭,然后执行shell(即打开第二个应用程序)。
ShellExecute
吗?那么就这样做!Sleep(100); ShellExecute(...)
。或者你想让ShellExecute
在新创建的进程退出之前不返回吗?如果是这样,理论上,你希望在ShellExecute
之后而不是之前使用Sleep
。但那是一个丑陋的解决方案。相反,你应该使用WaitForSingleObject
或类似的方法。 - Andreas RejbrandWaitForSingleObject
或其他更可靠的方法来代替固定的“睡眠”时间。 - Andreas Rejbrandsleep(1000); shellexecute(...
什么也不做呢? - Johan