как дождаться загрузки внешнего приложения?
От: h256 Россия  
Дата: 01.03.04 13:20
Оценка:
В программе запускаю, сервер, а потом к нему идет обращение, что вызывает ошибку если сервер не успел загрузиться, как дождаться полной загрузки?

и еще один вопросик — программа запускает внешнее приложение и ожидает его завершение, как перерисовывать окно программы? пока делаю так:

  unsigned threadId;
  HANDLE hThread;
  bool isOpen = false;
  hThread = (HANDLE)_beginthreadex(NULL, 4096, My_Open, (void *)isOpen, 0, &threadId);
  if(hThread == INVALID_HANDLE_VALUE)
  {
    ShowMessage("Ошибка.");
    return;
  }
  while(WAIT_TIMEOUT == WaitForSingleObject(hThread, 100))
    Application->ProcessMessages();
  CloseHandle(hThread);


ну и в функции My_Open запускаю внешнее приложение...
Re: как дождаться загрузки внешнего приложения?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.03.04 13:37
Оценка: 1 (1)
Здравствуйте, h256, Вы писали:


MsgWaitForSingleObject
и солнце б утром не вставало, когда бы не было меня
Re[2]: как дождаться загрузки внешнего приложения?
От: h256 Россия  
Дата: 01.03.04 14:21
Оценка:
Здравствуйте, Serginio1, Вы писали:
S>MsgWaitForSingleObject
Спасибо!

а что с сервером делать?
Re[3]: как дождаться загрузки внешнего приложения?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.03.04 14:26
Оценка:
Здравствуйте, h256, Вы писали:

H>Здравствуйте, Serginio1, Вы писали:

S>>MsgWaitForSingleObject
H>Спасибо!

H>а что с сервером делать?

Ну например пусть устанавливает некий глобальный Event в сигнальное положение. Если он твой конечно или запускай через свой пускатель, после чего опять же устанавливай эвент
и солнце б утром не вставало, когда бы не было меня
Re[4]: как дождаться загрузки внешнего приложения?
От: h256 Россия  
Дата: 01.03.04 14:31
Оценка:
Здравствуйте, Serginio1, Вы писали:
H>>а что с сервером делать?
S> Ну например пусть устанавливает некий глобальный Event в сигнальное положение. Если он твой конечно или запускай через свой пускатель, после чего опять же устанавливай эвент
если б я так мог, то сделал бы, сервер это сервер mysql, я его в программе и запускаю...
Re: как дождаться загрузки внешнего приложения?
От: Beatseed Россия  
Дата: 01.03.04 23:56
Оценка:
Здравствуйте, h256, Вы писали:

H>В программе запускаю, сервер, а потом к нему идет обращение, что вызывает ошибку если сервер не успел загрузиться, как дождаться полной загрузки?


А почему не устраивает вариант когда mssql автоматически загружен при запуске компьютера?
Re[2]: как дождаться загрузки внешнего приложения?
От: h256 Россия  
Дата: 02.03.04 12:31
Оценка:
Здравствуйте, Beatseed, Вы писали:
B>А почему не устраивает вариант когда mssql автоматически загружен при запуске компьютера?
потому что он нужен только тогда когда нужен
а в остальное время мне не нравится что висит сервак, память ест и ничего не делает...
Re: как дождаться загрузки внешнего приложения?
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 02.03.04 12:41
Оценка: +1
Здравствуйте, h256, Вы писали:

H>В программе запускаю, сервер, а потом к нему идет обращение, что вызывает ошибку если сервер не успел загрузиться, как дождаться полной загрузки?



Если запускаете внешнее приложение с помощью CreateProcess, то пользуйтесь функцией WaitForInputIdle. Вот маленький пример:


   STARTUPINFO startupInfo;
    ZeroMemory(&startupInfo, sizeof(startupInfo));
    startupInfo.cb = sizeof(startupInfo);
    PROCESS_INFORMATION processInfo;
    if (!CreateProcess(m_strExePath, NULL, NULL, NULL, FALSE, 
            0, NULL, m_strWorkingDir, &startupInfo, &processInfo))
       return;

     WaitForInputIdle(processInfo.hProcess, 60000);

     CloseHandle(processInfo.hThread);
    CloseHandle(processInfo.hProcess);



Приведенный пример ждет окончания инициализации запущенного процесса минуту.
Re[2]: как дождаться загрузки внешнего приложения?
От: Leonid Troyanovsky  
Дата: 02.03.04 13:59
Оценка:
Здравствуйте, Flamer, Вы писали:

H>>В программе запускаю, сервер, а потом к нему идет обращение, что вызывает ошибку если сервер не успел загрузиться, как дождаться полной загрузки?


F>Если запускаете внешнее приложение с помощью CreateProcess, то пользуйтесь функцией WaitForInputIdle. Вот маленький пример:


Это, конечно, так, но оно реагирует только на оконные приложения или, скажем, консоль в окне. Кроме того, готовность окон сервера может и не означать окончания его инициализации.

Что-то подсказывает мне, что если возможно запускать сервер из своей программы, то на этой машине есть и иной API, то есть StartService & ControlService.
--
С уважением, LVT
Re[3]: как дождаться загрузки внешнего приложения?
От: Romkin  
Дата: 02.03.04 14:13
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

F>>Если запускаете внешнее приложение с помощью CreateProcess, то пользуйтесь функцией WaitForInputIdle. Вот маленький пример:


LT> Это, конечно, так, но оно реагирует только на оконные приложения или, скажем, консоль в окне. Кроме того, готовность окон сервера может и не означать окончания его инициализации.


Управление возвращается, когда запущенное приложение начинает выбирать сообщения из очереди. Это не обязательно окно
Re[4]: как дождаться загрузки внешнего приложения?
От: Leonid Troyanovsky  
Дата: 02.03.04 14:22
Оценка:
Здравствуйте, Romkin, Вы писали:

WaitForInputIdle. Вот маленький пример:

LT>> Это, конечно, так, но оно реагирует только на оконные приложения или, скажем, консоль в окне. Кроме того, готовность окон сервера может и не означать окончания его инициализации.


R>Управление возвращается, когда запущенное приложение начинает выбирать сообщения из очереди. Это не обязательно окно


Ясное дело, что необязательно. Однако и твое утверждение неточно, т.к. дело не всегда в приложении. Возьмем ту же консольное приложение — если его пустить в родительской консоли, то никакого WaitForInputIdle не будет, но для свежераспределенной — пожалуйста.
--
С уважением, LVT
Re[2]: как дождаться загрузки внешнего приложения?
От: h256 Россия  
Дата: 02.03.04 14:22
Оценка:
Здравствуйте, Flamer, Вы писали:
Вот маленький пример:
благодарю, работает

снова возник вопрос про перерисовку(не все проверил вчера...)

я после запуска внешней программы жду ее завершение:

MsgWaitForMultipleObjectsEx(1,&hThread,INFINITE,QS_PAINT, 0);

и получается как только программа получает WM_PAINT, она работает дальше, т.е. не ждет как я хочу...
по крайней мере в дебагере произошло именно так....
как все таки сделать то что нужно? т.е. перерисовывать ожидающее окно...



И еще небольшой вопрос по IDE... у меня стоит BCB5, так вот после запуска все нормально, но минут через 5-10 он начинает что-то делать, вплоть до того что система считает его повисшим и проходит это по разному может несколько секунд, а может и минут, в зависимости от загрузки компа на тот момент... Так вот вопрос — это его нормальное поведение? Может у меня настроено что-то не так?
Re[3]: как дождаться загрузки внешнего приложения?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.03.04 14:36
Оценка:
Здравствуйте, h256, Вы писали:

H>и получается как только программа получает WM_PAINT, она работает дальше, т.е. не ждет как я хочу...

А ты в цикле. Так ты отработал WM_PAINT и снова на MsgWaitForMultipleObjectsEx пока недождешьмя

BOOL fQuit = FALSE; // надо ли завершить цикл? 

while (!fQuit) 
{ 

// поток пробуждается при освобождении обьекта ядра ИЛИ 
// для обработки сообщения от пользовательского интерфейса 

DWORD dwResult = MsgWaitForMultipleObjectsEx(1, &hEvent, INFINITE, QS_ALLEVENTS, MWMO_INPUTAVAILABLE); 

switch (dwResult} 
{ 

case WAIT_OBJECT_0: 

// освободилось событие 
break; 

case WAIT_OBJECT_0 + 1: 

// в очереди появилось сообщение 
// разослать все сообщения MSG msg; 

while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
{ 

if (msg.message == WM_QUIT) 
{ 

// сообщение WM_QUIT - выходим из цикла 
fQuit = TRUE; 

} 
else 
{ 

// транслируем и пересылаем сообщение 
TranslateMessage(&msg); 
DispatchMessage(&msg);

} 

} 

// наша очередь пуста 
break; 

} 

}


http://softs.h10.ru/literature.shtml?topic=visual&book=1&page=head26.htm
и солнце б утром не вставало, когда бы не было меня
Re[3]: как дождаться загрузки внешнего приложения?
От: Leonid Troyanovsky  
Дата: 02.03.04 14:37
Оценка:
Здравствуйте, h256, Вы писали:

H>я после запуска внешней программы жду ее завершение:


H>
H>MsgWaitForMultipleObjectsEx(1,&hThread,INFINITE,QS_PAINT, 0);
H>

H>и получается как только программа получает WM_PAINT, она работает дальше, т.е. не ждет как я хочу...
H>по крайней мере в дебагере произошло именно так....
H>как все таки сделать то что нужно? т.е. перерисовывать ожидающее окно...

Один только WM_PAINT, это, IMHO, не совсем правильно.
Хотя, если, так хочется, можешь подсмотреть у Peter Below:

      Repeat
        ret := MsgWaitForMultipleObjects(
                 1,             { 1 handle to wait on }
                 processHandle, { the handle }
                 False,         { wake on any event }
                 INFINITE,      { wait without timeout }
                 QS_PAINT or    { wake on paint messages }
                 QS_SENDMESSAGE { or messages from other threads }
                 );
        If ret = WAIT_FAILED Then Exit; { can do little here }
        If ret = (WAIT_OBJECT_0 + 1) Then Begin
          { Woke on a message, process paint messages only. Calling
            PeekMessage gets messages send from other threads processed. }
          While PeekMessage( msg, 0, WM_PAINT, WM_PAINT, PM_REMOVE ) Do
            DispatchMessage( msg );
        End;
      Until ret = WAIT_OBJECT_0;


На мой вкус, лучше делать "ожидающую" модальную формуздесь
--
С уважением, LVT
Re: как дождаться загрузки внешнего приложения?
От: Аноним  
Дата: 02.03.04 15:24
Оценка: :))
Терпение брат и только терпение поможет, не надо поддаваться инстинктам и опускаться.
Я знаю много случаев когда люди не сдерживаются, начинают бросать мышку в стенку, разбивают монитор, стучат кулаком по клавиатуре. Не стоит уподоблятся таким. Расслабся, порелаксируй. Абстрагируйся , говори себе "это же машина, просто машина, сейчас она едет и очень скоро мы приедем куда нужно". Можно сделать зарядку, сходить за очередной порцией чая или кофе.
Re[3]: как дождаться загрузки внешнего приложения?
От: h256 Россия  
Дата: 02.03.04 16:23
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT> Это, конечно, так, но оно реагирует только на оконные приложения или, скажем, консоль в окне. Кроме того, готовность окон сервера может и не означать окончания его инициализации.
видимо наткнулся на это
получилась такая ситуация что приложение не дождалось запуска сервера...

LT> Что-то подсказывает мне, что если возможно запускать сервер из своей программы, то на этой машине есть и иной API, то есть StartService & ControlService.

это я так понимаю именно управление сервисами. но в 98х их вроде как нету, так что не подходит.... какие еще варианты могут быть?

и еще как гарантировано протестировать что у меня приложение именно дождется загрузки сервера, а не просто он успел это сделать...
Re[4]: как дождаться загрузки внешнего приложения?
От: Leonid Troyanovsky  
Дата: 02.03.04 18:16
Оценка:
Здравствуйте, h256, Вы писали:

LT>> Что-то подсказывает мне, что если возможно запускать сервер из своей программы, то на этой машине есть и иной API, то есть StartService & ControlService.

H>это я так понимаю именно управление сервисами. но в 98х их вроде как нету, так что не подходит.... какие еще варианты могут быть?

В принципе, в составе еще 95 было такое понятие как remote admin, наверное, есть и такое API. Но, судя по проблеме, упомянутый сервер запускается локально, сл-но, польза от оного, в данном случае, практически отсутствует.

Т.е., в таких условиях, после запуска можно лишь делать Sleep(x), где x — устанавливать исходя из наихудшего возможного варианта, храня значение в реестре — для возможной модификации со стороны пользователей.
Можно, наверное, еще курить мануалы к mysql — вдруг рассылается какой-нибудь бродкаст о готовности

H>и еще как гарантировано протестировать что у меня приложение именно дождется загрузки сервера, а не просто он успел это сделать...


Возможно, что у этого сервера есть некоторые простые тесты, позволяющие сделать заключение о его боеготовности. Скажем, как у InterBase — ping gdb port.
--
С уважением, LVT
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.