Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.10.2008, 14:03
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию Запуск процесса, ожидание его завершения

Добрый день.

Можно ли сделать так:

1. Запустить процесс. (Например архивирование файла).
2. Ждать его завершения. (Но пока процесс не завершился, выводить что нибудь на экран)
3. Перейти далее... (например к отправке файла по почте). Это я сам сделаю...


Если делать так:
Код:
uses Windows;

var
  SI: _STARTUPINFOA;
  PI: _PROCESS_INFORMATION;
  RarParam : String;
begin
  RarParam := 'rar.exe a -ep ' + dPath + 'tmp\'+ FileName + '.rar ' + dPath + FileName;
  FillChar(SI, sizeof(SI), #0);
  SI.cb:=sizeof(SI);
  FillChar(PI, sizeof(PI), #0);
  CreateProcess(nil,PAnsiChar(RarParam),nil,nil,false,0,nil,nil,SI,PI);
  WaitForInputIdle(PI.hProcess, INFINITE);
  WaitForSingleObject(PI.hProcess,INFINITE);
  ShowMessage('Finish');
end;

То, естественно, сообщение Finish появиться когда rar закроется.

Как можно периодически опрашивать состояние процесса?
Ответить с цитированием
  #2  
Старый 27.10.2008, 14:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Читаем описание функции:

Код:
DWORD WINAPI WaitForSingleObject(
  __in  HANDLE hHandle,
  __in  DWORD dwMilliseconds
);

Второй параметр - время ожидания. Соответсвенно, ставишь какое-то разумное значение и цикл его.

Получится что-то типа:
Код:
While WaitForSingleObject(PI.hProcess,10) <> WAIT_OBJECT_0 Do
begin
// Здесь выводишь что-то свое.
end;

Функцию WaitForInputIdle не смотрел, но скорее всего:
1. работает точно также
2. Она вообще по логике не нужно, т.к. достаточно реализовывать ожидание по хэндлу процесса.

Да, внутри цикла не выводи ничего, что может тормознуть очередь сообщений, типа ShowMessge и т.п.
Ответить с цитированием
  #3  
Старый 27.10.2008, 14:24
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию

Большое спасибо. Самое оно. Можно запихать в цикл Application.ProcessMessages;
Вопрос закрыт.
Ответить с цитированием
  #4  
Старый 11.02.2009, 14:29
AtoM22 AtoM22 вне форума
Прохожий
 
Регистрация: 11.02.2009
Сообщения: 1
Репутация: 10
Вопрос Помогоите!

надо по щелчку по кнопке зпустить *.ехе файл, который лежит в папке с самой программой
Ответить с цитированием
  #5  
Старый 11.02.2009, 16:22
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

2AtoM22,
используй WinExec(),например, калькулятор можно вызвать так:
WinExec(PChar('calc.exe',SW_ShowNormal); Поскольку функция при отсутствии полного пути ищет файл в том числе и в папке с проектом, то указывать полный путь не надо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:29.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025