Здравствуйте, h256, Вы писали:
H>Здравствуйте, Serginio1, Вы писали: S>>MsgWaitForSingleObject H>Спасибо!
H>а что с сервером делать?
Ну например пусть устанавливает некий глобальный Event в сигнальное положение. Если он твой конечно или запускай через свой пускатель, после чего опять же устанавливай эвент
и солнце б утром не вставало, когда бы не было меня
Re[4]: как дождаться загрузки внешнего приложения?
Здравствуйте, Serginio1, Вы писали: H>>а что с сервером делать? S> Ну например пусть устанавливает некий глобальный Event в сигнальное положение. Если он твой конечно или запускай через свой пускатель, после чего опять же устанавливай эвент
если б я так мог, то сделал бы, сервер это сервер mysql, я его в программе и запускаю...
Здравствуйте, h256, Вы писали:
H>В программе запускаю, сервер, а потом к нему идет обращение, что вызывает ошибку если сервер не успел загрузиться, как дождаться полной загрузки?
А почему не устраивает вариант когда mssql автоматически загружен при запуске компьютера?
Re[2]: как дождаться загрузки внешнего приложения?
Здравствуйте, Beatseed, Вы писали: B>А почему не устраивает вариант когда mssql автоматически загружен при запуске компьютера?
потому что он нужен только тогда когда нужен
а в остальное время мне не нравится что висит сервак, память ест и ничего не делает...
Здравствуйте, h256, Вы писали:
H>В программе запускаю, сервер, а потом к нему идет обращение, что вызывает ошибку если сервер не успел загрузиться, как дождаться полной загрузки?
Если запускаете внешнее приложение с помощью CreateProcess, то пользуйтесь функцией WaitForInputIdle. Вот маленький пример:
Здравствуйте, Flamer, Вы писали:
H>>В программе запускаю, сервер, а потом к нему идет обращение, что вызывает ошибку если сервер не успел загрузиться, как дождаться полной загрузки?
F>Если запускаете внешнее приложение с помощью CreateProcess, то пользуйтесь функцией WaitForInputIdle. Вот маленький пример:
Это, конечно, так, но оно реагирует только на оконные приложения или, скажем, консоль в окне. Кроме того, готовность окон сервера может и не означать окончания его инициализации.
Что-то подсказывает мне, что если возможно запускать сервер из своей программы, то на этой машине есть и иной API, то есть StartService & ControlService.
--
С уважением, LVT
Re[3]: как дождаться загрузки внешнего приложения?
Здравствуйте, Leonid Troyanovsky, Вы писали:
F>>Если запускаете внешнее приложение с помощью CreateProcess, то пользуйтесь функцией WaitForInputIdle. Вот маленький пример:
LT> Это, конечно, так, но оно реагирует только на оконные приложения или, скажем, консоль в окне. Кроме того, готовность окон сервера может и не означать окончания его инициализации.
Управление возвращается, когда запущенное приложение начинает выбирать сообщения из очереди. Это не обязательно окно
Re[4]: как дождаться загрузки внешнего приложения?
WaitForInputIdle. Вот маленький пример:
LT>> Это, конечно, так, но оно реагирует только на оконные приложения или, скажем, консоль в окне. Кроме того, готовность окон сервера может и не означать окончания его инициализации.
R>Управление возвращается, когда запущенное приложение начинает выбирать сообщения из очереди. Это не обязательно окно
Ясное дело, что необязательно. Однако и твое утверждение неточно, т.к. дело не всегда в приложении. Возьмем ту же консольное приложение — если его пустить в родительской консоли, то никакого WaitForInputIdle не будет, но для свежераспределенной — пожалуйста.
--
С уважением, LVT
Re[2]: как дождаться загрузки внешнего приложения?
и получается как только программа получает WM_PAINT, она работает дальше, т.е. не ждет как я хочу...
по крайней мере в дебагере произошло именно так....
как все таки сделать то что нужно? т.е. перерисовывать ожидающее окно...
И еще небольшой вопрос по IDE... у меня стоит BCB5, так вот после запуска все нормально, но минут через 5-10 он начинает что-то делать, вплоть до того что система считает его повисшим и проходит это по разному может несколько секунд, а может и минут, в зависимости от загрузки компа на тот момент... Так вот вопрос — это его нормальное поведение? Может у меня настроено что-то не так?
Re[3]: как дождаться загрузки внешнего приложения?
Здравствуйте, 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;
}
}
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]: как дождаться загрузки внешнего приложения?
Здравствуйте, Leonid Troyanovsky, Вы писали: LT> Это, конечно, так, но оно реагирует только на оконные приложения или, скажем, консоль в окне. Кроме того, готовность окон сервера может и не означать окончания его инициализации.
видимо наткнулся на это
получилась такая ситуация что приложение не дождалось запуска сервера...
LT> Что-то подсказывает мне, что если возможно запускать сервер из своей программы, то на этой машине есть и иной API, то есть StartService & ControlService.
это я так понимаю именно управление сервисами. но в 98х их вроде как нету, так что не подходит.... какие еще варианты могут быть?
и еще как гарантировано протестировать что у меня приложение именно дождется загрузки сервера, а не просто он успел это сделать...
Re[4]: как дождаться загрузки внешнего приложения?
Здравствуйте, h256, Вы писали:
LT>> Что-то подсказывает мне, что если возможно запускать сервер из своей программы, то на этой машине есть и иной API, то есть StartService & ControlService. H>это я так понимаю именно управление сервисами. но в 98х их вроде как нету, так что не подходит.... какие еще варианты могут быть?
В принципе, в составе еще 95 было такое понятие как remote admin, наверное, есть и такое API. Но, судя по проблеме, упомянутый сервер запускается локально, сл-но, польза от оного, в данном случае, практически отсутствует.
Т.е., в таких условиях, после запуска можно лишь делать Sleep(x), где x — устанавливать исходя из наихудшего возможного варианта, храня значение в реестре — для возможной модификации со стороны пользователей.
Можно, наверное, еще курить мануалы к mysql — вдруг рассылается какой-нибудь бродкаст о готовности
H>и еще как гарантировано протестировать что у меня приложение именно дождется загрузки сервера, а не просто он успел это сделать...
Возможно, что у этого сервера есть некоторые простые тесты, позволяющие сделать заключение о его боеготовности. Скажем, как у InterBase — ping gdb port.