我有一个希望很快的问题:是否有可能延迟ShellExecute的执行一点点?在执行ShellExecute之前等待吗?
我有一个autoupdater的应用程序。在下载所有必要的文件等之后,它将当前文件重命名为* .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;
此过程应该重新启动应用程序。我确信删除问题是由第二个应用程序的快速启动引起的,因为如果我自己重新启动它,给它一点时间,文件就会正常删除。
tl; dr版本:我需要调用ShellExecute(),等待一会儿(0.1秒左右),然后执行命令。
注
我尝试使用-ping命令来尽量拖延,但没有奏效。
非常感谢你提前
编辑:改写
我需要这样的事情发生|| 第一款应用关闭;等待100毫秒;第二个应用程序打开 ||。我需要先调用ShellExecute,然后等到调用应用程序完全关闭,然后执行shell(即打开第二个应用程序)
我不明白。你想等待100毫秒,然后执行'ShellExecute'?那么,那么这样做! '睡眠(100);的ShellExecute(...)'。或者你想'ShellExecute' *不能返回,直到新创建的进程退出*?如果是这样,从理论上讲,你希望***'ShellExecute'之后的'Sleep' ***,而不是*之前。但这是一个丑陋的解决方案。相反,你应该'WaitForSingleObject'或类似的东西。 – 2011-05-15 16:24:55
我会尝试重写它:我需要这种情况||第一个应用关闭;等待100毫秒;第二个应用打开||。我需要先调用ShellExecute,然后等待调用应用程序完全关闭,然后执行shell(即打开第二个应用程序) - >您的建议都不是。我需要ShellExecute _not执行,直到当前应用程序完全关闭(这样我可以删除它的文件) – 2011-05-15 16:29:46
你不能那样做。应用程序1关闭后,但在应用程序2打开之前,您无法执行任何操作,因为您没有程序运行。你可以做的是调用一些应用程序,睡觉,然后调用其他应用程序,然后终止。但是,而不是一个固定的'睡眠',你应该'WaitForSingleObject'或其他更健壮的东西。 – 2011-05-15 16:32:36