Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Насколько верен следующий код завершения программы: [D7, Win2k, WinXP]


Страницы:   1 2

Дмитрий Белькевич ©   (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 прибиваю, а своё приложение другим своим же. Вот меня и интересует, успеет ли оно закрыть корректно все транзакции?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо