Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > прога запускает и ждет окончания другой


Автор: superVad 6.4.2006, 09:21
запускаю програму с помощью ShellExecute (0, nil,'gbak параметры', nil, nil, 0);
мне надо чтобы база востановилась из бэкапа и программа пошла работать дальше обращаясь уже к этой базе
а получается, что запускается gbak, а программа продолжает работать и база не успевает создастся
может кто чем поможет?

Автор: Snowy 6.4.2006, 09:34
Как запустить программу и подождать ее завершения:
Код
var
  pi : TProcessInformation;  
  si : TStartupInfo;  
begin 
  ZeroMemory(@si,sizeof(si));  
  si.cb:=SizeOf(si);  
  if CreateProcess('', 'gbak параметры', nil, nil, false, 0, nil, nil, si, pi) then
  begin
    WaitForSingleObject(pi.hProcess,INFINITE);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
  end else ; // не запустилась
end;

Автор: superVad 6.4.2006, 09:38
блин, я чтото подобное делал на 3 курсе когда изучали многопоточность smile совсем забыл

большое спасибо

Автор: Gershkovich 6.4.2006, 10:40
Snowy как всегда рулит

Однако есть доп. вопрос

Я нашел в Инете подобный пример на ассемблере
(впрочем код и так понятен)


Код

    invoke CloseHandle,    [ProcessInfo.hThread]            ; release resources
    invoke WaitForInputIdle,    [ProcessInfo.hProcess], INFINITE    ; wait for initialization end
    invoke WaitForSingleObject, [ProcessInfo.hProcess], INFINITE    ; wait for process
    invoke GetExitCodeProcess, [ProcessInfo.hProcess], _exitCode   ; get return code
    invoke CloseHandle,    [ProcessInfo.hProcess]            ; release resources


Тоже самое но CloseHandle, [ProcessInfo.hThread]
вызывается раньше чем CloseHandle, [ProcessInfo.hProcess]
И, что самое интересное, раньше WaitForSingleObject

Snowy, не мог бы ты прокомментировать ?

Заранее спасибо.

ЗЫ Забыл сказать - код, который я привел - рабочий.
Вроде работает, но меня мучают смутные сомнения, првильно ли я сделал?

Автор: superVad 6.4.2006, 10:54
появился неприятный момент - что бы это работало надо подключить Windows, а в программе я использую поиск с помошью FindFirst, FindNext, FindClose (SysUtils)

Так вот после подключения Windows выдается ошибка:
[Error] load2base.dpr(285): Incompatible types: 'Cardinal' and 'TSearchRec'
строка:
FindClose(TrueFile);

насколько я понял процедура с названием FindClose есть и в Windows, но с параметром другого типа

если ктото сталкивался с таким напишите

PS пока закоментировал все FindClose, вроде работает

Автор: _hunter 6.4.2006, 10:58
SysUtils.FindClose?
а что тебя смущает? закрывается ведь hThread а не hProcess

Автор: Rennigth 6.4.2006, 11:00
SysUtils.FindClose итд

Автор: superVad 6.4.2006, 11:04
SysUtils.FindClose - работает отлично

тока заметил такаяже проблема была с DeleteFile, теперь все отлично

всем спасибо

Автор: Snowy 6.4.2006, 11:08
Цитата(Gershkovich @ 6.4.2006, 10:40 Найти цитируемый пост)
Тоже самое но  CloseHandle, [ProcessInfo.hThread]вызывается раньше чем CloseHandle, [ProcessInfo.hProcess]И, что самое интересное, раньше WaitForSingleObjectSnowy, не мог бы ты прокомментировать ?
Просто хэндл треда нам не нужен. Ждем то мы освобождения хэндла процесса. Поэтому нам все равно когда отпускать хандл треда.

Цитата(superVad @ 6.4.2006, 10:54 Найти цитируемый пост)
ак вот после подключения Windows выдается ошибка:
Просто перемести Windows в начало списка uses. И все заработает.
При совпадении имен, используется та структура или функция, которая описана в модуле, стоящем позже в списке uses.
Т.к. ты добавил Windows в конец списка, то стали браться функции и структуры из него.
Всего лишь нужно, чтобы SysUtils в списке uses стоял позже Windows.

Автор: superVad 6.4.2006, 11:19
Ага, переместил и отлично работает

в CreateProcess первый параметр поставил nil иначе не запускался

Автор: Демо 6.4.2006, 19:20
superVad,
См. также SHellExecuteEx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)