我有一個希望很快的問題:是否有可能延遲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