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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.05.2015, 12:28
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Как отследить завершение другой программы?

Всем привет! Ребята, я делаю Ланчер для игры, не знаю как отследить ее завершение и сделать определенные действия после этого.

При нажатии на кнопку в виртуальный привод монтируется образ диска, потом игра запускается, я для этого использовал функцию ShellExecute (не уверен, правильно ли это, но главное работает). Теперь мне нужно что бы Ланчер отследил завершение игры и размонтировал образ...

делаю примерно так:

Код:
ShellExecute(0, nil, 'c:\program files\daemon tools lite\dtlite.exe', PChar('-mount dt, 0, "d:\games\mygame\img\mygame.cue"'), nil, SW_HIDE);
ShellExecute(0, nil, Pchar(ExtractFilePath(Application.ExeName)+'mygame.exe'),PChar(Keys), nil, SW_RESTORE);

Как отследить завершение процесса, при этом чтоб программа не грузила процессор а тихо сидела и ждала в памяти...?

Заранее спасибо!
Ответить с цитированием
  #2  
Старый 18.05.2015, 12:48
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

CreateProcess, WaitForSingleObject
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Alloc (18.05.2015)
  #3  
Старый 18.05.2015, 13:20
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А можно и так, по drkb
Код:
Var
  exInfo: TShellExecuteInfo;
Begin
  FillChar( exInfo, Sizeof(exInfo), 0 );
  With exInfo Do Begin
    cbSize:= Sizeof( exInfo ); // required!
    fMask := SEE_MASK_NOCLOSEPROCESS;
    Wnd   := Handle;  // forms handle
    lpVerb:= 'paintto';
    lpFile:= Pchar( pdffilename );
    lpParameters := PChar( printernameAndPort );
    nShow := SW_HIDE;
  End;
  If ShellExecuteEx( @exInfo ) Then Begin
     While GetExitCodeProcess( exinfo.hProcess, exitcode )
          and (exitcode = STILL_ACTIVE)
     Do
       Sleep( 500 );
     CloseHandle( exinfo.hProcess );
     DeleteFile( pdffilename );
  End
  Else
    ShowMessage(SysErrorMessage( GetLastError ));
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Alloc (18.05.2015)
  #4  
Старый 18.05.2015, 13:55
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо за подсказки.

Нашел в интернете небольшой код который мне подходит. Так как мои познания в программировании пока не столь значимы, я прошу вас мне помочь немного подредактировать ниже следующий код.. после запуска второго приложения - первое ждет когда оно завершится и при этом зависает когда с ним взаимодействуешь.. как этого избежать?

Код:
 function StartFileAndWait(CommandString: string): boolean;      //âõîä - êîìàíäà çàïóñêà
var
	si: TStartupInfo;
	pi: TProcessInformation;
begin
	Result := False;
	ZeroMemory( @si, sizeof( si ) );
	si.cb := SizeOf( si );
	if not CreateProcess( nil, // No module name (use command line).
		PChar( CommandString ), // Command line.
		nil, // Process handle not inheritable.
		nil, // Thread handle not inheritable.
		False, // Set handle inheritance to FALSE.
		0, // No creation flags.
		nil, // Use parent's environment block.
		nil, // Use parent's starting directory.
		si, // Pointer to STARTUPINFO structure.
		pi ) // Pointer to PROCESS_INFORMATION structure.
	then
	begin
    result:=false;
		Exit;
	end;
	WaitForSingleObject( pi.hProcess, INFINITE );
	CloseHandle( pi.hThread );
	CloseHandle( pi.hProcess );
  Application.BringToFront;
  Result := True;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  if StartFileAndWait('cmd.exe') then ShowMessage('Process terminated');
end;

Заранее спасибо!
Ответить с цитированием
  #5  
Старый 18.05.2015, 14:04
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

WaitForSingleObject в отдельном потоке...
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Alloc (18.05.2015)
  #6  
Старый 18.05.2015, 14:59
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
WaitForSingleObject в отдельном потоке...

если б я знал как это сделать... не поможете?
Ответить с цитированием
  #7  
Старый 18.05.2015, 15:39
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

По идеи, если заменить в вашем коде
Код:
...
WaitForSingleObject(pi.hProcess,INFINITE);
...
на
Код:
...
while (WaitforSingleObject(pi.hProcess, 200) = WAIT_TIMEOUT) do
  application.ProcessMessages;
...
то сборка не будет казаться завешанной и будет отвечать на сообщения
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Alloc (18.05.2015)
  #8  
Старый 18.05.2015, 16:18
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Код:
...
while (WaitforSingleObject(pi.hProcess, 200) = WAIT_TIMEOUT) do
  application.ProcessMessages;
...

а почему именно WaitforSingleObject(pi.hProcess, 200)? я просто попробовал поставить задержку меньше, на 1 и приложение вообще не тормозит..

Подскажите еще, как на ваш взгляд, приведенный выше код грамотно написан?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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