Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WaitForSingleObject, почему не всегда ждет? 
:(
    Опции темы
Madest
Дата 13.5.2004, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 27.11.2003
Где: Городок

Репутация: нет
Всего: нет



У меня почему-то при инсталяции некой программы первый раз проскакивает мимо WaitForSingleObject(), а потом когда ставлю поверх - нормально ждет. Почему?

...
STARTUPINFO si;
si.cb=sizeof(STARTUPINFO);
si.lpReserved=NULL;
si.lpDesktop=NULL;
si.lpTitle=NULL;
si.dwFlags=STARTF_USESHOWWINDOW;
si.wShowWindow=SW_SHOWNORMAL;
si.cbReserved2=0;
si.lpReserved2=NULL;
static PROCESS_INFORMATION pi;
CreateProcess(NULL,"c:\\1\\setup",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
WaitForSingleObject(pi.hProcess,INFINITE);
MessageBox(NULL,"setup","aga",MB_OK);
...

нее, никогда оказывается не ждет.

Это сообщение отредактировал(а) Madest - 13.5.2004, 12:07
--------------------
PM MAIL   Вверх
bel_nikita
Дата 13.5.2004, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Попробуй, но не знаю, поможет ли sad.gif
Цитата
static PROCESS_INFORMATION pi;
CreateProcess(NULL,"c:\\1\\setup",NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi);
ResumeThread(pi.hTread);
WaitForSingleObject(pi.hProcess,INFINITE);




--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Madest
Дата 13.5.2004, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 27.11.2003
Где: Городок

Репутация: нет
Всего: нет



Не помогает =(
Это под XP такое. В 2000-м эта же программа нормально себя вела (не замечал во всяком случае).
А может это от того что MySQL устанавливаю?

Это сообщение отредактировал(а) Madest - 13.5.2004, 15:02
--------------------
PM MAIL   Вверх
Madest
Дата 13.5.2004, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 27.11.2003
Где: Городок

Репутация: нет
Всего: нет



В общем, при инсталяции именно MySQL, WaitForSingleObject() не ловит этот процесс. Как это сделать?
--------------------
PM MAIL   Вверх
AndyY
Дата 13.5.2004, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



Инсталлеры часто распаковывают в temp и запускать другой процесс, после чего закрываются.
Так, к примеру, устроен wise.
Нужно внимательно посмотреть в таск менеджере, совпадает ли process id инсталлера с возвращенным в startupinfo (после того как wait завершился)


--------------------
PM MAIL WWW   Вверх
Madest
Дата 13.5.2004, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 27.11.2003
Где: Городок

Репутация: нет
Всего: нет



Пытаюсь это так ловить его - не выходит =(

HWND hwnd=GetActiveWindow();
LPDWORD lpId;
GetWindowThreadProcessId(hwnd,lpId);
WaitForSingleObject((HANDLE)lpId,INFINITE);

Хотя сам догадываюсь, что нужно ловить хэндл другого (второго) инсталяционного окна, которое выскакивает после первого. Первое закрывается, а инсталяция еще продолжается.

Это сообщение отредактировал(а) Madest - 13.5.2004, 17:03
--------------------
PM MAIL   Вверх
Madest
Дата 13.5.2004, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 27.11.2003
Где: Городок

Репутация: нет
Всего: нет



Хотя сам догадываюсь, что нужно ловить хэндл другого (второго) инсталяционного окна, которое выскакивает после первого. Первое закрывается, а инсталяция еще продолжается.
--------------------
PM MAIL   Вверх
DenDen
Дата 13.5.2004, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 25.3.2004

Репутация: нет
Всего: нет



А ты в дебаггере проверял. Он точно не NULL??
А еще попробуй флаг STARTF_FORCEONFEEDBACK--может каким-то образом случиться, что процесс либо к моменту занесения еще не запустился, либо в случае перегруженности машины, в процессе проссто поменялось значение дескриптора. Это не так болезненно для процессора. как может показаться на первый взгляд. У меня уже такое бывало.
PM MAIL   Вверх
mr.DUDA
Дата 14.5.2004, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
Пытаюсь это так ловить его - не выходит =(

HWND hwnd=GetActiveWindow();
LPDWORD lpId;
GetWindowThreadProcessId(hwnd,lpId);
WaitForSingleObject((HANDLE)lpId,INFINITE);

Конечно не будет работать - т.к. ID процесса и хэндл процесса разные вещи !!!

Совсем другое дело, если получать потом хэндл процесса по его ID (OpenProcess), либо сделать вот так:
Цитата
CString cmdLine = " -какие то параметры в командной строке";
SHELLEXECUTEINFO sei; memset(&sei, 0, sizeof(SHELLEXECUTEINFO));
sei.cbSize=sizeof(sei);
sei.lpFile=new char [_MAX_PATH];
strcpy((LPSTR)sei.lpFile, (LPCTSTR)("c:\\temp\\program.exe"));
sei.lpDirectory = filePath;
sei.nShow = SW_MINIMIZE;
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpParameters = cmdLine;
CWaitCursor cur;
ShellExecuteEx(&sei);
WaitForSingleObject(sei.hProcess, 60000); // ждём 60 секунд





--------------------
user posted image
PM MAIL WWW   Вверх
Madest
Дата 14.5.2004, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 27.11.2003
Где: Городок

Репутация: нет
Всего: нет



Одолел! Нашел последнее окошко и жду пока его закроют.
В общем, вот код кому интересно: как установить MySQL, создать сервис и запустить его. Юзеру остается только ввести пароль root.

Код

STARTUPINFO si;
si.cb=sizeof(STARTUPINFO);
si.lpReserved=NULL;
si.lpDesktop=NULL;
si.lpTitle=NULL;
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_FORCEONFEEDBACK;
si.wShowWindow=SW_SHOWNORMAL;
si.cbReserved2=0;
si.lpReserved2=NULL;
static PROCESS_INFORMATION pi;
LPTSTR st1=new char[80];
st1="c:\\1\\setup";
CreateProcess(NULL,st1,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
HWND hwnd=NULL;
do
{
hwnd=FindWindow(NULL,"Setup complete");
}
while(!hwnd);
while(IsWindow(hwnd));
st2="c:\\mysql\\bin\\mysqld-max-nt --install";
CreateProcess(NULL,st2,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
WaitForSingleObject(pi.hProcess,INFINITE);
SC_HANDLE sch;
sch=OpenSCManager(NULL,NULL,NULL);
SC_HANDLE my=OpenService(sch,"MySql",SC_MANAGER_ALL_ACCESS);
StartService(my,NULL,NULL);
st2="mysql -u root mysql";
CreateProcess(NULL,st2,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
WaitForSingleObject(pi.hProcess,INFINITE);


Цитата

Конечно не будет работать - т.к. ID процесса и хэндл процесса разные вещи !!!


Mr.DUDA, у меня были такие подозрения =) Надо как-нить для общего развития и через SHELLEXECUTEINFO сделать.

Cпасибо всем.

--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0516 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.