Главная страница
    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.006 c
7-8202
Nalsur
2002-07-23 14:33
2002.10.03
TSystemInfo


7-8194
rastochnik
2002-07-26 16:40
2002.10.03
compaq armada 7400 - подскажите, как в bios попасть?


1-7964
Link
2002-09-19 18:58
2002.10.03
Быстрый отчёт


3-7780
Mike Pr
2002-09-14 22:11
2002.10.03
Два вопроса


3-7779
woland
2002-09-14 23:35
2002.10.03
Как в QuickReport вывести надписть вертикально?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский