Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему не получается запустить процессы друг задругом с ожиданием [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]

Ну так пока окончания первого не дождешься, второй же не запустится, наверно


Наверх

Титульная страница Поиск, карта сайта Написать письмо