![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Насколько верен следующий код завершения программы: [D7, Win2k, WinXP]
Дмитрий Белькевич © (2007-01-23 01:27:00)PostThreadMessage(ProcessInfo.dwThreadId, WM_Quit, 0, 0);
Закрываю другую программу из своей, запускал createprocess.
В этом случае программа коректно завершится? Не хочется экспериментировать. Внешне всё ок.
Больше всего интересует - запишуться ли данные в базу. База - firebird 1.0/1.5.
Дмитрий Белькевич (2007-01-26 15:00:00) [1]Спасибо за ответ.
Делал именно так потому, что ProcessInfo.dwThreadId уже есть после запуска (CreateProcess'ом запускаю) - ничего искать дополнительно не нужно.
Сергей М. (2007-01-26 13:14:00) [2]
> Дмитрий Белькевич © (26.01.07 13:02) [20]
В [14] ты засомневался:
> какое отношение Application, в котором и крутиться очередь
> (и куда, как я понимаю, и попадают сообщения, посылаемые
> в тред) к основному (или какому-либо другому) окну?
Ответ прост - Application выбирает всесообщения, адресованные как окнам данного приложения, так и осн.треду процесса этого приложения. Прежде чем диспетчеризовать их, объект проверяет, не поступило ли сообщение WM_QUIT, причем никак не анализирует конкретного его адресата и не овечает на сообщение (согласно док-ции сообщение WM_QUIT не предполагает никакого ответа на него и может быть послано асинхронно). Так что в принципе WM_QUIT можно посылать и осн.треду с пом. PostThreadMessage, но, imho, все же логичней в случае с Application таки посылать его гл.окну, а не осн.треду.
Дмитрий Белькевич (2007-01-26 13:02:00) [3]>Цикл в Application.Run() проверяет флаг Terminated и по факту его взведения завершается
Так, собственно в [14] я это и говорил.
>imho, вполне достаточно.
Спасибо за мнение. Погоняю, посмотрю - практика рассудит.
Сергей М. (2007-01-26 08:08:00) [4]imho, вполне достаточно.
Цикл в Application.Run() проверяет флаг Terminated и по факту его взведения завершается.
Дмитрий Белькевич (2007-01-26 03:11:00) [5]Так и спрашиваю ;)
Сергей М. (2007-01-25 16:24:00) [6]
> Там поднимается Terminate, а application.run работает until
> Terminated.
>
И что, этого не достаточно в твоем случае ?
Дмитрий Белькевич (2007-01-25 16:17:00) [7]>какое отношение
В контескте обсуждения wm_quit?
Сергей М. (2007-01-25 15:56:00) [8]
> Дмитрий Белькевич © (25.01.07 15:22) [14]
> какое отношение
Самое прямое)
Дмитрий Белькевич (2007-01-25 15:22:00) [9]Да я смотрел, что по wm_quit очередь фактически сразу же заканчивается.
Там поднимается Terminate, а application.run работает until Terminated.
Но какое отношение Application, в котором и крутиться очередь (и куда, как я понимаю, и попадают сообщения, посылаемые в тред) к основному (или какому-либо другому) окну?
MSDN (2007-01-25 14:52:00) [10]Дмитрий Белькевич © (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 14:00:00) [11]
> Дмитрий Белькевич © (25.01.07 13:44) [11]
Конечно имеет.
Именно окну, а не треду.
Посмотри реализацию метода TApplication.Procesmessage() - сразу все прояснится.
Дмитрий Белькевич (2007-01-25 13:44:00) [12]Имеет принципиальное значение треду слать, или окну слать?
Сергей М. (2007-01-25 13:27:00) [13]
> Дмитрий Белькевич © (25.01.07 13:09) [8]
У тебя есть окно с хэндлом Application.Handle.
Посылай этому окну сообщение WM_QUIT - и всех делов.
Дмитрий Белькевич (2007-01-25 13:12:00) [14]>Программы же обе твои
Если не сложно, хотелось бы еще, так сказать, для общего случая придумать вариант. То есть, останавливающее приложение - моё, останавливаемое - нет. Спасибо.
Дмитрий Белькевич (2007-01-25 13:09:00) [15]>WM_USER + 666
Спасибо, возможно так и сделаю. Да, приложения оба мои.
>У тебя что, безоконное приложение
Свёрнутое в трей, основная форма скрыта, но может быть развёрнута пользователем.
Сергей М. (2007-01-25 09:56:00) [16]
> Дмитрий Белькевич © (25.01.07 02:32) [5]
У тебя что, безоконное приложение ?
Джо (2007-01-25 04:40:00) [17]> [5] Дмитрий Белькевич © (25.01.07 02:32)
> Спасибо за ответ.
> Еще вопрос: может потоку что нибудь другое, менее жесткое
> послать?
> Windows же как-то закрывает корректно, по крайней мере,
> никогда проблем не было.
> Может какой-нибудь WM_ENDSESSION послать?
Ну, посылай заранее условленное сообщение, какое-нибудь WM_USER + 666 и соответственно обрабатывай его, со всеми нужными действиями. Программы же обе твои?
Дмитрий Белькевич (2007-01-25 02:32:00) [18]Спасибо за ответ.
Еще вопрос: может потоку что нибудь другое, менее жесткое послать?
Windows же как-то закрывает корректно, по крайней мере, никогда проблем не было.
Может какой-нибудь WM_ENDSESSION послать?
Сергей М. (2007-01-24 08:17:00) [19]
> Дмитрий Белькевич © (24.01.07 05:49) [3]
> успеет ли оно закрыть корректно все транзакции?
Это зависит от реакции осн.потока твоего приложения на сообщение WM_QUIT.
Если при этом ты предпринимаешь необходимые действия по корректному завершению неподтвержденных т/акций, то нет повода для волнений.
Дмитрий Белькевич (2007-01-24 05:49:00) [20]Я не fb прибиваю, а своё приложение другим своим же. Вот меня и интересует, успеет ли оно закрыть корректно все транзакции?