Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-8228
MJH
2002-08-18 01:17
2002.10.03
WinXP


1-8015
SONY
2002-09-21 16:20
2002.10.03
Как загрузить и отмасштабировать JPEGImage в TImage


6-8103
ga3
2002-08-01 04:07
2002.10.03
насчет конфигурации IE


3-7875
Roma
2002-09-13 18:26
2002.10.03
Возвращаение набора данных хранимой процедурой


1-8050
ava
2002-09-21 22:50
2002.10.03
Закипел





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский