Текущий архив: 2007.03.18;
Скачать: CL | DM;
Вниз
Насколько верен следующий код завершения программы: Найти похожие ветки
← →
Дмитрий Белькевич © (2007-01-23 01:27) [0]PostThreadMessage(ProcessInfo.dwThreadId, WM_Quit, 0, 0);
Закрываю другую программу из своей, запускал createprocess.
В этом случае программа коректно завершится? Не хочется экспериментировать. Внешне всё ок.
Больше всего интересует - запишуться ли данные в базу. База - firebird 1.0/1.5.
← →
Германн © (2007-01-23 01:31) [1]
> Больше всего интересует - запишуться ли данные в базу. База
> - firebird 1.0/1.5.
А на www.ibase.ru что говорят по этому поводу? Или ты там и не спрашивал?
← →
Сергей М. © (2007-01-23 08:36) [2]
> В этом случае программа коректно завершится?
Не факт.
> запишуться ли данные в базу
Тоже не факт.
> запускал createprocess
Чем не устроила работа с FB как с сервисом ?
← →
Дмитрий Белькевич © (2007-01-24 05:49) [3]Я не fb прибиваю, а своё приложение другим своим же. Вот меня и интересует, успеет ли оно закрыть корректно все транзакции?
← →
Сергей М. © (2007-01-24 08:17) [4]
> Дмитрий Белькевич © (24.01.07 05:49) [3]
> успеет ли оно закрыть корректно все транзакции?
Это зависит от реакции осн.потока твоего приложения на сообщение WM_QUIT.
Если при этом ты предпринимаешь необходимые действия по корректному завершению неподтвержденных т/акций, то нет повода для волнений.
← →
Дмитрий Белькевич © (2007-01-25 02:32) [5]Спасибо за ответ.
Еще вопрос: может потоку что нибудь другое, менее жесткое послать?
Windows же как-то закрывает корректно, по крайней мере, никогда проблем не было.
Может какой-нибудь WM_ENDSESSION послать?
← →
Джо © (2007-01-25 04:40) [6]> [5] Дмитрий Белькевич © (25.01.07 02:32)
> Спасибо за ответ.
> Еще вопрос: может потоку что нибудь другое, менее жесткое
> послать?
> Windows же как-то закрывает корректно, по крайней мере,
> никогда проблем не было.
> Может какой-нибудь WM_ENDSESSION послать?
Ну, посылай заранее условленное сообщение, какое-нибудь WM_USER + 666 и соответственно обрабатывай его, со всеми нужными действиями. Программы же обе твои?
← →
Сергей М. © (2007-01-25 09:56) [7]
> Дмитрий Белькевич © (25.01.07 02:32) [5]
У тебя что, безоконное приложение ?
← →
Дмитрий Белькевич © (2007-01-25 13:09) [8]>WM_USER + 666
Спасибо, возможно так и сделаю. Да, приложения оба мои.
>У тебя что, безоконное приложение
Свёрнутое в трей, основная форма скрыта, но может быть развёрнута пользователем.
← →
Дмитрий Белькевич © (2007-01-25 13:12) [9]>Программы же обе твои
Если не сложно, хотелось бы еще, так сказать, для общего случая придумать вариант. То есть, останавливающее приложение - моё, останавливаемое - нет. Спасибо.
← →
Сергей М. © (2007-01-25 13:27) [10]
> Дмитрий Белькевич © (25.01.07 13:09) [8]
У тебя есть окно с хэндлом Application.Handle.
Посылай этому окну сообщение WM_QUIT - и всех делов.
← →
Дмитрий Белькевич © (2007-01-25 13:44) [11]Имеет принципиальное значение треду слать, или окну слать?
← →
Сергей М. © (2007-01-25 14:00) [12]
> Дмитрий Белькевич © (25.01.07 13:44) [11]
Конечно имеет.
Именно окну, а не треду.
Посмотри реализацию метода TApplication.Procesmessage() - сразу все прояснится.
← →
MSDN (2007-01-25 14:52) [13]Дмитрий Белькевич © (25.01.07 13:44) [11]
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/WindowsUserInterface/Windowing/Windows/WindowReference/WindowMessages/WM_QUIT.asp
The WM_QUIT message is not associated with a window and therefore will never be received through a window"s window procedure. It is retrieved only by the GetMessage or PeekMessage functions.
← →
Дмитрий Белькевич © (2007-01-25 15:22) [14]Да я смотрел, что по wm_quit очередь фактически сразу же заканчивается.
Там поднимается Terminate, а application.run работает until Terminated.
Но какое отношение Application, в котором и крутиться очередь (и куда, как я понимаю, и попадают сообщения, посылаемые в тред) к основному (или какому-либо другому) окну?
← →
Сергей М. © (2007-01-25 15:56) [15]
> Дмитрий Белькевич © (25.01.07 15:22) [14]
> какое отношение
Самое прямое)
← →
Дмитрий Белькевич © (2007-01-25 16:17) [16]>какое отношение
В контескте обсуждения wm_quit?
← →
Сергей М. © (2007-01-25 16:24) [17]
> Там поднимается Terminate, а application.run работает until
> Terminated.
>
И что, этого не достаточно в твоем случае ?
← →
Дмитрий Белькевич © (2007-01-26 03:11) [18]Так и спрашиваю ;)
← →
Сергей М. © (2007-01-26 08:08) [19]imho, вполне достаточно.
Цикл в Application.Run() проверяет флаг Terminated и по факту его взведения завершается.
← →
Дмитрий Белькевич © (2007-01-26 13:02) [20]>Цикл в Application.Run() проверяет флаг Terminated и по факту его взведения завершается
Так, собственно в [14] я это и говорил.
>imho, вполне достаточно.
Спасибо за мнение. Погоняю, посмотрю - практика рассудит.
← →
Сергей М. © (2007-01-26 13:14) [21]
> Дмитрий Белькевич © (26.01.07 13:02) [20]
В [14] ты засомневался:
> какое отношение Application, в котором и крутиться очередь
> (и куда, как я понимаю, и попадают сообщения, посылаемые
> в тред) к основному (или какому-либо другому) окну?
Ответ прост - Application выбирает все сообщения, адресованные как окнам данного приложения, так и осн.треду процесса этого приложения. Прежде чем диспетчеризовать их, объект проверяет, не поступило ли сообщение WM_QUIT, причем никак не анализирует конкретного его адресата и не овечает на сообщение (согласно док-ции сообщение WM_QUIT не предполагает никакого ответа на него и может быть послано асинхронно). Так что в принципе WM_QUIT можно посылать и осн.треду с пом. PostThreadMessage, но, imho, все же логичней в случае с Application таки посылать его гл.окну, а не осн.треду.
← →
Дмитрий Белькевич © (2007-01-26 15:00) [22]Спасибо за ответ.
Делал именно так потому, что ProcessInfo.dwThreadId уже есть после запуска (CreateProcess"ом запускаю) - ничего искать дополнительно не нужно.
Страницы: 1 вся ветка
Текущий архив: 2007.03.18;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.038 c