Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ожидание завершения процесса 
:(
    Опции темы
Irinka
  Дата 6.9.2006, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.9.2006

Репутация: нет
Всего: нет



Есть ярлык, запускающий процесс на удаленном сервере. Необходима программа отслеживающая завершение этого процесса.  smile  smile 
PM MAIL   Вверх
Yanis
Дата 6.9.2006, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Цитата(Irinka @  6.9.2006,  09:38 Найти цитируемый пост)
Есть ярлык, запускающий процесс на удаленном сервере.

Ярлык на локальном компьютере, который запускает программу на удалённом?
Не врубился....


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
_hunter
Дата 6.9.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



ищи на форуме доку по работе с ярлыками -- получиш путь к запускаемому приложению.
а потом как обычно -- CreateProcess + WaitForSingleObject


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Alexeis
Дата 6.9.2006, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Да это странно, можно с ярлыка запустить программу только на своем компьютере. Либо на той стороне должен быть "исполнитель", который запустит программу после передачи ему определенной команды.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
BUGOR
Дата 6.9.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: 2
Всего: 16



Может речь об удалённом рабочем столе. Короче вопрос не ясен.


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
Yanis
Дата 6.9.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



В любом случае программа должна работать на той стороне где запускается требуемый процесс.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Irinka
Дата 6.9.2006, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.9.2006

Репутация: нет
Всего: нет



да, речь идет об удаленном рабочем столе...
PM MAIL   Вверх
Yanis
Дата 6.9.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Ну и что? За тебя нужно программу написать что ли? Что нужно то? Запустить и отследить завершение программы очень просто.
http://vingrad.ru/DELPHI-DLP-000765

Даль ше то, что? Ты что стешняешься?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Irinka
Дата 7.9.2006, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.9.2006

Репутация: нет
Всего: нет



Мне не нужно запускать программу, она запускается из другого приложения и создает определенный процесс, мне нужно отследить  завершение этого процесса
PM MAIL   Вверх
_hunter
Дата 7.9.2006, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



ну тогда поиск на форуме на тему "список окон" или "список процессов"


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Yanis
Дата 7.9.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Irinka
Вот накатал специально для тебя примерчик. Надеюсь поможет smile

Код
{*
* Функция возвращает PID процесса
* szFileName - имя искомого процесса (можно передавать путь к файлу целиком)
* Функция возвращает PID первого найденого процесса с именем szFileName
* Если процесс не найден, то возвращает 0
*
* Function retrieve the the process Id
* szFileName - process file name to search for
* Return value - dwProcessId of first founded process with name szFileName
* If process szFileName not founded, then return value is NULL
*}

function FindProcess(const szFileName: string): DWORD;
var
  fn: string;
  aProcesses: array[0..1023] of DWORD;
  cbNeeded, cProcesses, hProcess, hMod: DWORD;
  i: Integer;
  szProcessName: array[0..MAX_PATH - 1] of Char;
begin
  Result := 0;

  // вдруг нам передали путь к файлу целиком
  fn := ExtractFileName(szFileName);

  if not EnumProcesses(@aProcesses, SizeOf(aProcesses), cbNeeded) then
    Exit;

  // кол-полученое кол-во процессов
  cProcesses := cbNeeded div SizeOf(cProcesses);

  for i := 0 to cProcesses - 1 do
    begin
      // получаем хэндл процесса, что бы узнать имя исполняемого файла
      hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
        False,
        aProcesses[i]);

      // если удалось открыть объект - процесс, то
      if hProcess > 0 then
        begin
          // перечисляем все модули процесса
          if EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cbNeeded) then
            GetModuleBaseName(hProcess, hMod, szProcessName, SizeOf(szProcessName));

          // сравниваем с нашим (искомым) процессом
          if AnsiCompareText(szProcessName, fn) = 0 then
            Result := aProcesses[i];
        end;

      // закрываем описатель. Он нам больше не нужен
      CloseHandle(hProcess);
    end;
end;


Далее привожу пример, как отыскать процесс с именем notepad.exe и подождать его завершения:
Код
var
  dwProcessId, hProcess: DWORD;
begin
  dwProcessId := FindProcess('notepad.exe');

  if dwProcessId > 0 then
    if Application.MessageBox(PChar('Ждать завершения процесса с PID = ' + IntToStr(dwProcessId)),
      nil,
      MB_ICONQUESTION or MB_YESNO) = ID_YES then
      begin
        hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, dwProcessId);
        if hProcess > 0 then
          begin
            Application.MessageBox(PChar('Программа продолжит работу после завершения процесса notepad.exe (PID = ' + IntToStr(dwProcessId) + ')'),
                                   nil, MB_ICONWARNING);

            // теперь программа продолжит работу
            // только после завершения процесса notepad.exe
            while WaitForSingleObject(hProcess, 100) <> WAIT_OBJECT_0 do
              Application.ProcessMessages;

            CloseHandle(hProcess);

            // здесь располагается код для выполенния действий
            // после завершения процесса notepad.exe

            Application.MessageBox(PChar('Процесс notepad.exe (PID = ' + IntToStr(dwProcessId) + ') завершил своё существование'),
                                   nil, MB_ICONINFORMATION);
          end;
      end;
end;


Это сообщение отредактировал(а) Yanis - 7.9.2006, 11:47


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Irinka
Дата 7.9.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.9.2006

Репутация: нет
Всего: нет



Пример мне помог, но не до конца,  smile  возникла проблема с тем что этот процесс, буду называть его процесс1 при завершении запускает еще один процесс - процесс2. А тот в свое время опять может запустить первый. Мне необходимо сделать проверку следующего вида, если процесс1 and процесс2 отработали, тогда выход. С программой такого вида сталкиваюсь первый раз, поэтому у меня большие трудности...
PM MAIL   Вверх
_hunter
Дата 7.9.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



крути два цикла (по циклу на процесс)


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Yanis
Дата 7.9.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Irinka
Какие проблемы? Достаточно переделать функцию, что бы она принимала 2 параметра - имена процессов, а возвращала например массив (ну или указатель на него) с двумя значениями - PID первого и второго процесса. Потом в моём примере делать OpenProcess для 2х процессов.

P. S. А сразу нельзя было сказать поточнее? smile

Добавлено @ 15:57 
Только что прочитал и сам удивился, что я сказанул smile

Достаточно дава раза вызвать функцию FindProcess для двух процессов, открыть (OpenProcess) их получив тем самым их описатель (т.е. hProcess1, hProcess2) и использовать такую конструкцию:

Код
while (WaitForSingleObject(hProcess1, 100) <> WAIT_OBJECT_0) and (WaitForSingleObject(hProcess2, 100) <> WAIT_OBJECT_0) do
  Application.ProcessMessages;



--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 14.2.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



случайно на тему напоролся)
а почему бы в последнем примере не использовать WaitForMultipleObjects?

Это сообщение отредактировал(а) MetalFan - 14.2.2007, 15:09


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0894 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.