Запускаю программу Delphi, открывается форма, нажимаю на кнопку, происходит выполнение команды через cmd.exe . Мне нужно дождаться завершения ее выполнения. И пока команда не выполниться — у меня сама форма (программа) Delphi находится в замороженном состоянии. Мне нужно, чтобы сама форма (программа) Delphi — не была в замороженном состоянии. То есть её можно было передвигать.
Как сделать, чтобы окно программы Delphi в процессе выполнения CMD.exe не застывало? То есть обработка в отдельном потоке.
var LCmd: string; LInfo: TStartupInfo; LPI: TProcessInformation; begin // Заполняем структуры LCmd := ‘cmd.exe ‘ + SPar; FillChar(LInfo, SizeOf(LInfo), 0); LInfo.cb := SizeOf(LInfo); LInfo.dwFlags := STARTF_USESHOWWINDOW; LInfo.wShowWindow := SW_HIDE; // Запускаем программу Win32Check(CreateProcess( ‘cmd.exe’, // lpApplicationName, PChar(LCmd), // lpCommandLine, nil, // lpProcessAttributes, nil, // lpThreadAttributes, False, // bInheritHandles, CREATE_NO_WINDOW, // dwCreationFlags, nil, // lpEnvironment, nil, // lpCurrentDirectory, LInfo, // lpStartupInfo, LPI // lpProcessInformation )); try // Закрываем хендл главного потока (он нам не нужен) CloseHandle(LPI.hThread); // Ждем завершения процесса Win32Check(WaitForSingleObject(LPI.hProcess, INFINITE) <> WAIT_FAILED); finally // Закрываем хендл процесса CloseHandle(LPI.hProcess); end; ShowMessage(‘Программа завершена’); end;
Отслеживать
Delphi DS150E Установка и активация. 2016 пошаговая инструкция.
13.6k 12 12 золотых знаков 43 43 серебряных знака 72 72 бронзовых знака
Источник: ru.stackoverflow.com
Программирование на Delphi
Как запустить приложение и подождать пока оно отработает 4
как запустить из Вашей программы еще какую-нибудь программу и дождаться ее закрытия. Для удобства сразу оговорюсь: Ваша программа — это программа, код которой здесь приведен. Другая программа — программа, которая была запущена из Вашей. Для запуска другой программы мы будем использовать функцию CreateProcess, поскольку она возвращает handle созданного процесса.
Для ожидания завершения процесса (программы) нужно вызвать Wai В этом примере функция ExecuteAndWait запускает другую программу (имя запускаемого файла — FileName). Если HideApplication установлен в true, то Ваша программа исчезает на время выполнения другой программы. В противном случае Ваша программа остается на экране и каждые 0.1 сек. будут выполняться все задачи, которые накопились в очереди (Application.ProcessMessages). А если пользователь решит закрыть Вашу программу — закроется и другая программа. Процедура SetEnabled
Установка и активация Delphi Autocom CDP 2017. Настройка BLUETOOTH соединения с Delphi Ds150e.
function ExecuteAndWait(FileName: string; HideApplication: boolean): boolean; var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; exitc: cardinal; begin FillChar(StartupInfo, sizeof(StartupInfo), 0); with StartupInfo do begin cb := Sizeof(StartupInfo); dwFlags := STARTF_USESHOWWINDOW; wShowWindow := SW_SHOW; end; if not CreateProcess(nil, PChar(FileName), nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then result := false else begin if HideApplication then begin Application.Minimize; ShowWindow(Application.Handle, SW_HIDE); WaitforSingleObject(ProcessInfo.hProcess, INFINITE); end else while WaitforSingleObject(ProcessInfo.hProcess, 100) = WAIT_TIMEOUT do begin Application.ProcessMessages; if Application.Terminated then TerminateProcess(ProcessInfo.hProcess, 0); end; GetExitCodeProcess(ProcessInfo.hProcess, exitc); result := (exitc = 0); if HideApplication then begin ShowWindow(Application.Handle, SW_SHOW); Application.Restore; Application.BringToFront; end; end; end; procedure TForm1.Button1Click(Sender: TObject); procedure SetEnabled(en: boolean); var i: integer; begin for i := 0 to Form1.ComponentCount — 1 do if Form1.Components[i] is TControl then (Form1.Components[i] as TControl).Enabled := en; end; begin SetEnabled(false); if not ExecuteAndWait(Edit1.Text, CheckBox1.Checked) then ShowMessage(‘Возникли какие-то проблемы’); SetEnabled(true); end;
Программа и Интерфейс — Приложения чужие
Взаимодействие с чужими окнами
Источник: delphibaza.ru