![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Всем привет! Ребята, я делаю Ланчер для игры, не знаю как отследить ее завершение и сделать определенные действия после этого.
При нажатии на кнопку в виртуальный привод монтируется образ диска, потом игра запускается, я для этого использовал функцию 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
|
||||
|
||||
![]() CreateProcess, WaitForSingleObject
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Alloc (18.05.2015)
|
#3
|
||||
|
||||
![]() А можно и так, по 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
|
||||
|
||||
![]() Спасибо за подсказки.
Нашел в интернете небольшой код который мне подходит. Так как мои познания в программировании пока не столь значимы, я прошу вас мне помочь немного подредактировать ниже следующий код.. после запуска второго приложения - первое ждет когда оно завершится и при этом зависает когда с ним взаимодействуешь.. как этого избежать? Код:
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
|
||||
|
||||
![]() WaitForSingleObject в отдельном потоке...
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Alloc (18.05.2015)
|
#6
|
||||
|
||||
![]() Цитата:
если б я знал как это сделать... не поможете? |
#7
|
||||
|
||||
![]() По идеи, если заменить в вашем коде
Код:
... WaitForSingleObject(pi.hProcess,INFINITE); ... Код:
... while (WaitforSingleObject(pi.hProcess, 200) = WAIT_TIMEOUT) do application.ProcessMessages; ... Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Alloc (18.05.2015)
|
#8
|
||||
|
||||
![]() Цитата:
а почему именно WaitforSingleObject(pi.hProcess, 200)? я просто попробовал поставить задержку меньше, на 1 и приложение вообще не тормозит.. Подскажите еще, как на ваш взгляд, приведенный выше код грамотно написан? |