Форум: "Основная";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];
ВнизПочему не получается запустить процессы друг задругом с ожиданием Найти похожие ветки
← →
mmb (2002-09-19 18:45) [0]Запускаю 1-ый процесс CreateProcess и жду WaitForSingleObject( pi.hProcess, INFINITE );
закрываю CloseHandle( pi.hProcess ); CloseHandle( pi.hThread );
и
Запускаю 2-ый процесс CreateProcess и жду WaitForSingleObject( pi.hProcess, INFINITE ); ДО ПОСИНЕНИЯ !!! Оказывается моя прога уже и не откликается. После сброса её 2-ый процесс наконец СТАРТУЕТ и ждать мне его нечем - программы нет уже.
Подскажите
Что я не так делаю???
← →
MBo (2002-09-19 18:50) [1]Ну так пока окончания первого не дождешься, второй же не запустится, наверно
← →
mmb (2002-09-19 18:53) [2]а функция WaitForSingleObject что здесь тогда делает?
← →
MBo (2002-09-19 18:59) [3]вызывающий поток ждет возврата из этой функции и дальше пока не идет.
Приведи код
← →
mmb (2002-09-19 19:07) [4]
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 19:47) [5]Ну так, как я и говорил, пока первыq процесс не завершится, второй не запускается. Какая логика работы нужна? Может, запускать процессы в доп. потоках?
← →
MBR (2002-09-19 20:22) [6]Столкнулся с подобной фигней. Вот что говорит 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. Но время должно немного кушать :(
← →
Юрий Зотов (2002-09-20 00:28) [7]MsgWaitForMultipleObjects(Eх).
Или поместить весь этот код в дополнительный поток.
← →
mmb (2002-09-20 13:32) [8]Я наверно плохо обьяснил, что требуется.
Необходимо запустить 1-ый процесс (это получилось)
дождаться его завершиния (это тоже получилось)
Запустить 2-ой процесс (а вот это уже получилось только частично) - поясняю что не так : CreateProcess выполнилась нормально, но процесс на самом деле не стартавал и вызов WaitForSingleObject завис. После принудительного завершения - 2-ой процесс стартовал.
← →
Digitman (2002-09-20 13:46) [9]>mmb
Как это он, 2-й процесс не стартовал ? У тебя же 2-й вызов CreateProcess() вернул True ? так что ж ты говоришь тогда, что он не стартовал ? Стартовал он ! Иначе последующий WairFor-вызов не "висел" бы, а сразу вернул бы отказ по несуществующему хэндлу.
Отсутствие визуальных признаков работы процесса не есть факт отсутствия процесса.
← →
mmb (2002-09-20 15:11) [10]Если он стартовал то почему я его не вижу на экране и не могу закрыть?
← →
Digitman (2002-09-20 15:24) [11]>mmb
А это - совершенно иной вопрос, нежели ты поставил !
В списке процессов он наблюдается тобой ?
← →
mmb (2002-09-20 15:28) [12]Да ты прав - он и первым не работает, т.е. в списке процессов он есть но исп ЦП = 0.
← →
mmb (2002-09-20 15:33) [13]Может вопрос по новому задать или нельзя?
← →
MBo (2002-09-20 15:48) [14]>вопрос по новому задать
Зачем? Тут же новые обстоятельства выяснились, вот и опиши, что получилось, а что еще не удается сделать
← →
mmb (2002-09-20 16:39) [15]Проблема оказалось в следующем:
Запускаю 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 может быть такого - все остальные программы так срабатывают нормально?
← →
Digitman (2002-09-20 18:01) [16]Setup.exe чего ? Какого продукта ?
← →
mmb (2002-09-23 14:08) [17]Setup от VisiBroker
← →
Digitman (2002-09-23 14:38) [18]Не исключено, что проблема - в правах и привелегиях на старт и доступ к VisiBroker-процессу. Все же стартуешь ты его в W2k, а не в Win9x. Обрати внимание на токен процесса и на security descriptor.
Это - раз.
Второе. Обрати внимание на dwCreationFlags.
Третье. Если "исп ЦП = 0", это может говорить о том, что процесс Setup VisiBroker сам вызвал некую ф-цию ожидания (либо ждет ответа на SendMessage). Не исключено, что Setup VisiBroker пытается как-то взаимодействовать со стартовавшим его процессом либо обращается к некоему ресурсу, занятому в дан.момент стартующим процессом. В результате - ситуация "dead lock".
Попробуй на время изменить однострочный вызов WaitForSingleObject() на цикл с MsgWaitForMultipleObjects, обрабатывающий кр.всего прочего оконные сообщения и сообщения ввода/вывода.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c