-
Час добрый, ребята! Подскажите, пожалуйста, что делаю не так (код ниже). Планировалось, что создаю поток и запускаю в нем на исполнение файл, ожидаю его выполнения. Но при работе оказывается, что основное окно программы остается недоступным, пока не выполнится приложение запущенное..
procedure TExecThread.Execute;
begin
FreeOnTerminate:=True;
DoExecAndWait
end;
procedure TExecThread.DoExecAndWait;
var SI : TShellExecuteINfo;
begin
si.lpFile:='';
si.cbSize:=sizeof(Si);
si.lpVerb:='open';
si.nShow:=SW_NORMAL;
si.fmask := SEE_MASK_NOCLOSEPROCESS;
si.lpFile:=PWideChar(PlanArray[GetCurrentParam].CmdLine);
si.lpParameters:=PWideChar(PlanArray[GetCurrentParam].cmdParam);
try
if ShellExecuteEx(@si) then
begin
WaitForSingleObject(si.hProcess, INFINITE);
if PSStatus.OutPut = 1 then MainForm.OnOffButtonClick(self);
MainForm.TaskMemo.Lines.Add('Запуск выполнен успешно. Файл: ' + PlanArray[GetCurrentParam].CmdLine);
end
except
MainForm.TaskMemo.Lines.Add('Ошибка запуска. Файл: ' + PlanArray[GetCurrentParam].CmdLine);
end;
-
если WaitForSingleObject то не тратить ресурсы на доп поток, а делать все в основном. так как это одно и тоже.
-
vbs (08.01.18 11:31) Спасибо за ответ! А есть ли альтернативные варианты?
-
если интерфейс блокируется, но ожидание сидит внутри execute вторичного, то твой DoExecAndWait выполняется в основном потоке.
-
> vbs (08.01.18 13:14) [3]
Спасибо! Как это дело исправить? Попробовал так, не знаю, насколько корректно.. repeat
try
Application.ProcessMessages;
GetExitCodeProcess(Si.hProcess, ExitCode);
except
end;
until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
-
А я не понял в чём конкретно проблема. Подробнее опишите задачу.
> создаю поток
А он вам точно нужен для решения сей задачи? Пока не увидел явной необходимости. При каком событии / в какой момент это происходит?
> запускаю в нем на исполнение файл, ожидаю его выполнения
Файл? bmp? Может всё-таки приложение/процесс?
> оказывается, что основное окно программы остается недоступным, пока не выполнится приложение запущенное
А разве не этого вы и хотели? Ждать пока не выполнится? А вы что-то ещё другое хотите делать пока оно не выполнилось? А что хотите сделать после того как выполнится?
-
-
> Вайрекс (08.01.18 16:56) [5]
Хотел выполнить действие по завершении работы запущенного приложения, при этом хотел, чтобы основное окно оставалось активным для управления
|