![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему не получается запустить процессы друг задругом с ожиданием [D6, Win2k]
mmb © (2002-09-19 18:45:00)Запускаю 1-ый процесс CreateProcess и жду WaitForSingleObject( pi.hProcess, INFINITE );
закрываю CloseHandle( pi.hProcess ); CloseHandle( pi.hThread );
и
Запускаю 2-ый процесс CreateProcess и жду WaitForSingleObject( pi.hProcess, INFINITE ); ДО ПОСИНЕНИЯ !!! Оказывается моя прога уже и не откликается. После сброса её 2-ый процесс наконец СТАРТУЕТ и ждать мне его нечем - программы нет уже.
Подскажите
Что я не так делаю???
Digitman (2002-09-23 14:38:00) [1]Не исключено, что проблема - в правах и привелегиях на старт и доступ к VisiBroker-процессу. Все же стартуешь ты его в W2k, а не в Win9x. Обрати внимание на токен процесса и на security descriptor.
Это - раз.
Второе. Обрати внимание на dwCreationFlags.
Третье. Если "исп ЦП = 0", это может говорить о том, что процесс Setup VisiBroker сам вызвал некую ф-цию ожидания (либо ждет ответа на SendMessage). Не исключено, что Setup VisiBroker пытается как-то взаимодействовать со стартовавшим его процессом либо обращается к некоему ресурсу, занятому в дан.момент стартующим процессом. В результате - ситуация "dead lock".
Попробуй на время изменить однострочный вызов WaitForSingleObject() на цикл с MsgWaitForMultipleObjects, обрабатывающий кр.всего прочего оконные сообщения и сообщения ввода/вывода.
mmb (2002-09-23 14:08:00) [2]Setup от VisiBroker
Digitman (2002-09-20 18:01:00) [3]Setup.exe чего ? Какого продукта ?
mmb (2002-09-20 16:39:00) [4]Проблема оказалось в следующем:
Запускаю Setup из своей программв с помощью CreateProcess вот так
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
cmdline:="c:\dir\setup.exe";
if not CreateProcess( nil, // No module name (use command line
PChar(cmdline), // 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 struct.
then begin
ShowMessage( "CreateProcess failed." );
Exit;
end;
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
процесс стартует но не работает: на экране не появляется и использование ЦП в диспетчере задач всё время = 0, соответственно дождаться его окончания с помощью WaitForSingleObject не получается и вся работа останавливается. Что в этом setup может быть такого - все остальные программы так срабатывают нормально?
MBo (2002-09-20 15:48:00) [5]>вопрос по новому задать
Зачем? Тут же новые обстоятельства выяснились, вот и опиши, что получилось, а что еще не удается сделать
mmb (2002-09-20 15:33:00) [6]Может вопрос по новому задать или нельзя?
mmb (2002-09-20 15:28:00) [7]Да ты прав - он и первым не работает, т.е. в списке процессов он есть но исп ЦП = 0.
Digitman (2002-09-20 15:24:00) [8]>mmb
А это - совершенно иной вопрос, нежели ты поставил !
В списке процессов он наблюдается тобой ?
mmb (2002-09-20 15:11:00) [9]Если он стартовал то почему я его не вижу на экране и не могу закрыть?
Digitman (2002-09-20 13:46:00) [10]>mmb
Как это он, 2-й процесс не стартовал ? У тебя же 2-й вызов CreateProcess() вернул True ? так что ж ты говоришь тогда, что он не стартовал ? Стартовал он ! Иначе последующий WairFor-вызов не "висел" бы, а сразу вернул бы отказ по несуществующему хэндлу.
Отсутствие визуальных признаков работы процесса не есть факт отсутствия процесса.
mmb (2002-09-20 13:32:00) [11]Я наверно плохо обьяснил, что требуется.
Необходимо запустить 1-ый процесс (это получилось)
дождаться его завершиния (это тоже получилось)
Запустить 2-ой процесс (а вот это уже получилось только частично) - поясняю что не так : CreateProcess выполнилась нормально, но процесс на самом деле не стартавал и вызов WaitForSingleObject завис. После принудительного завершения - 2-ой процесс стартовал.
Юрий Зотов (2002-09-20 00:28:00) [12]MsgWaitForMultipleObjects(Eх).
Или поместить весь этот код в дополнительный поток.
MBR (2002-09-19 20:22:00) [13]Столкнулся с подобной фигней. Вот что говорит MSDN о WaitForSingleObject:
--
Use caution when calling the wait functions and code that directly or indirectly creates windows. If a thread creates any windows, it must process messages. Message broadcasts are sent to all windows in the system. A thread that uses a wait function with no time-out interval may cause the system to become deadlocked. Two examples of code that indirectly creates windows are DDE and COM CoInitialize. Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx, rather than WaitForSingleObject.
--
Я пока сделал с использованием GetExitCodeProcess+Application.HandleMessages. Но время должно немного кушать :(
MBo (2002-09-19 19:47:00) [14]Ну так, как я и говорил, пока первыq процесс не завершится, второй не запускается. Какая логика работы нужна? Может, запускать процессы в доп. потоках?
mmb (2002-09-19 19:07:00) [15]
procedure TForm1.Button1Click(Sender: TObject);
var si:STARTUPINFO;
pi:PROCESS_INFORMATION;
cmdline:string;
begin
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
cmdline:="c:\dir1\setup.exe";
if not CreateProcess( nil, // No module name (use command line
PChar(cmdline), // 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 struct.
then
begin
ShowMessage( "CreateProcess failed." );
Exit;
end;
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
//
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
cmdline:="c:\dir2\setup.exe";
if not CreateProcess( nil, // No module name (use command line
PChar(cmdline), // 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 struct.
then
begin
ShowMessage( "CreateProcess failed." );
Exit;
end;
WaitForSingleObject( pi.hProcess, INFINITE );
// сюда не попадаем
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
MBo (2002-09-19 18:59:00) [16]вызывающий поток ждет возврата из этой функции и дальше пока не идет.
Приведи код
mmb (2002-09-19 18:53:00) [17]а функция WaitForSingleObject что здесь тогда делает?
MBo (2002-09-19 18:50:00) [18]Ну так пока окончания первого не дождешься, второй же не запустится, наверно