Конференция "Начинающим" » Ожидание выполнение программы
 
  • Chee (08.01.18 11:22) [0]
    Час добрый, ребята! Подскажите, пожалуйста, что делаю не так (код ниже). Планировалось, что создаю поток и запускаю в нем на исполнение файл, ожидаю его выполнения. Но при работе оказывается, что основное окно программы остается недоступным, пока не выполнится приложение запущенное..

    procedure TExecThread.Execute;
    begin
     FreeOnTerminate:=True;
     //Synchronize( DoExecAndWait)
     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;

  • vbs (08.01.18 11:31) [1]
    если  WaitForSingleObject то не тратить ресурсы на доп поток, а делать все в основном.
    так как это одно и тоже.
  • Chee (08.01.18 11:37) [2]
    vbs   (08.01.18 11:31)  Спасибо за ответ! А есть ли альтернативные варианты?
  • vbs (08.01.18 13:14) [3]
    если интерфейс блокируется,
    но ожидание сидит внутри execute вторичного,
    то твой DoExecAndWait выполняется в основном потоке.
  • Chee (08.01.18 15:15) [4]

    > vbs   (08.01.18 13:14) [3]

    Спасибо! Как это  дело исправить?
    Попробовал так, не знаю, насколько корректно..
      repeat
         try
          Application.ProcessMessages;
          GetExitCodeProcess(Si.hProcess, ExitCode);
         except
            {do nothing}
         end;
        until (ExitCode <> STILL_ACTIVE) or Application.Terminated;

  • Вайрекс (08.01.18 16:56) [5]
    А я не понял в чём конкретно проблема. Подробнее опишите задачу.

    > создаю поток

    А он вам точно нужен для решения сей задачи? Пока не увидел явной необходимости.
    При каком событии / в какой момент это происходит?

    > запускаю в нем на исполнение файл, ожидаю его выполнения

    Файл? bmp? Может всё-таки приложение/процесс?

    > оказывается, что основное окно программы остается недоступным, пока не выполнится приложение запущенное

    А разве не этого вы и хотели? Ждать пока не выполнится?
    А вы что-то ещё другое хотите делать пока оно не выполнилось? А что хотите сделать после того как выполнится?
  • Leonid Troyanovsky © (09.01.18 10:07) [6]

    > Chee   (08.01.18 15:15) [4]

    > Попробовал так, не знаю, насколько корректно..

    http://rsdn.org/forum/delphi/500558.1

    --
    Regards, LVT.
  • Chee (20.01.18 14:05) [7]

    > Вайрекс   (08.01.18 16:56) [5]

    Хотел выполнить действие по завершении работы запущенного приложения, при этом хотел, чтобы основное окно оставалось активным для управления
 
Конференция "Начинающим" » Ожидание выполнение программы
Есть новые Нет новых   [118585   +35][b:0][p:0.001]