Запустить программу и ждать ее завершения

Тема в разделе "WASM.BEGINNERS", создана пользователем l_inc, 15 май 2007.

  1. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Собственно сабж я реализовал и все работает, но мне не нравится.
    Как реализовал: Запустил программу с помощью CreateProcess. Из структуры PROCESS_INFORMATION взял hProcess (hThread закрыл сразу CloseHandle'ом) и использовал его в качестве параметра GetExitCodeProcess, которую вызываю в цикле до тех пор пока она возвращает lpExitCode равный STILL_ACTIVE. Ну естессно закрыл по выходу из цикла hProcess.
    Что не нравится: Мне кажется CreateProcess слишком массивна (в плане оформления в программе), а использую я оттуда только hProcess (почти все остальное, включая структуры, забито нулями). Не подскажете, нет ли чего-нибудь по проще, например с использованием просто ShellExecute для запуска (только не перебирая после этого в цикле список процессов, ожидая пока имя соответствующего процесса наконец там исчезнет: ИМХО это еще массивнее и выполняться будет дольше)? Есть ли что-нибудь менее чайниковское, чем вызывать в цикле GetExitCodeProcess (например WaitForSingleObject: только я не знаю как его применительно к процессам использовать)? Т.е. что-нибудь, что, возможно, требует меньше ресурсов системы.
     
  2. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    ShellExec...
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    OFMG... WaitForSingleObject ?
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    asmfan
    О. Большое спасибо! А я думал, что WaitForSingleObject может вернуться не только по завершению работы процесса, а еще и по какому-то другому событию, и про ShellExecuteEx забыл. Еще раз спасибо.
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Great
    Дык я ж про него в первом посте написал. Но мне уже asmfan помог. :) Anyway thanks.
     
  6. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Да вэлком конечно!)
     
  7. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    l_inc
    Так же, как и применительно ко всему остальному :)
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    цитирую MSDN:

     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Great
    Даже видя эту фразу перед собой и зная о ее наличии в MSDN, не могу ее найти. С большим трудом нашел похожую с тем же смыслом. :) Но разумеется не в описании функции WaitForSingleObject: там только список объектов с которыми работает WaitForSingleObject. А вообще спасибо: бум знать. :)
     
  10. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    Хмм... Долго искал эту фразу в MSDN к VS2005 и VS 6.0 - не нашел, хотя точно помню, что читал ее, и не раз =/ В итоге нашел в гугле в описании функции WaitForSingleObject, но далеко не на M$-вском сайте. Great, у тебя какой MSDN?
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Atlantic
    У меня не совсем MSDN, а небольшая выжимка из него. Причем довольно древняя, к сожалению (
    Видимо, при ее составлении юзали не только MSDN. В мсдне я действительного такого не нашел :)
    Вот полный текст у меня для WaitForSingleObject:

     
  12. Zhelezovsky

    Zhelezovsky Member

    Публикаций:
    0
    Регистрация:
    24 окт 2006
    Сообщения:
    39
    Код (Text):
    1. if CreateProcess (nil, PChar(sPath + '.exe'),
    2.               nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then bRunning := True
    3.               else bRunning := False; {Произошла ошибка запуска процесса}
    4.       while bRunning do begin
    5.         Application.ProcessMessages;
    6.         if WaitForSingleObject (ProcessInfo.hProcess, 0) = WAIT_OBJECT_0 then bRunning := False;
    7.       end;
    Что-то типа этого
     
  13. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Zhelezovsky
    Ну...спасибо за Bemühung, но:
    Во-первых, я написал, что хочу отказаться от CreateProcess.
    Во-вторых, asmfan мне сразу дал ответ, удовлетворяющий всем условиям и причем на всеми любимом ассемблере (хотя мне все-равно на чем, тем более, что я писал на VB :) ).
    В-третьих, не уверен, что Ваш код вообще целесообразен начиная с самого цикла: собственно цикл ИМХО не нужен, т.к. выполнится один единственный раз. Отсюда же не нужен Application.ProcessMessages, т.к. поток все равно повиснет в ожидании возврата из WaitForSingleObject.
    To All
    Поправьте, если я в пункте "В-третьих" не прав. А в остальном тема закрыта.

    Zhelezovsky
    P.S. Извиняюсь. Не заметил нуля в качестве времени ожидания. Но вариант с INFINITE мне нравится больше, т.к. опять-таки я хотел отказаться от цикла.
     
  14. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    l_inc
    а почему бы не
    start.exe /WAIT MyProg.exe
    MyProg1.exe
    :)
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    PROFi
    Потому что программка должна не просто запускать другую и ждать завершения. Она делает "чуть" по больше.
     
  16. Zhelezovsky

    Zhelezovsky Member

    Публикаций:
    0
    Регистрация:
    24 окт 2006
    Сообщения:
    39
    l_inc
    Извинения приняты. :)
    Как кому нравится. Мне CreateProcess нравится больше, чем ShellExec. Чисто субъективно.
    А INFINITE мне не подошло, потому что сообщения необходимо было обрабатывать, вот и сделал цикл.