Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прога не дает завершиться винде. Как побороть? События при перезагрузке? 
:(
    Опции темы
tippmann
  Дата 29.3.2004, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.3.2004
Где: Ивантеевка

Репутация: нет
Всего: нет



Программка с использованием RxTrayIcon. Написана на Дельфи 6. Почти всегда свернута в трей.
Полезная работа: отдельным потоком коннектится по UDP к серверу и периодически опрашивает состояние, которое отображает в StringGrid.
Проблема:
При завершении работы или перезагрузке в трее остается только иконка этой проги (она продолжает работать), и винда не может завершиться.
Причем, если окно проги активно - сама прога завершается, а винда перегружается только при повторном тычке на кнопку "Перезагрузка". Если окно проги свернуто в трей (т.е. видно только иконку) - совсем ничего не происходит (и прога работает, и винда не завершается).
Где чего написать чтоб винда нормально завершилась - я уж и не знаю. Все перепробовал, все ФАКи перерыл...
Вот все процедуры которые вроде отношение имеют к этому:
Код

procedure TForm1.WMQueryEndSession
           (Var Message: TWMQueryEndSession);
begin
inherited;
 CleanUp;
 Message.Result:= integer(true);
 //postquitmessage(0);

end;

//****************************************************
procedure TForm1.CleanUp;
begin
with TRegistry.Create do
 begin
 try
   RootKey := HKEY_CURRENT_USER;
   if OpenKey('\Software\keysoft', True) then
     begin
     WriteInteger('left', Form1.Left);
     WriteInteger('top', Form1.Top);
     end;
 finally
   CloseKey;
   Free;
 end;
 end;
 Application.Restore;
 Application.BringToFront;
 AppClosing := true;
 MainThread.ExitThread(nil); //оборвали нить
 application.terminate;
end;
//****************************************************
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 cleanup;
 CanClose := true;

end;


Это сообщение отредактировал(а) tippmann - 29.3.2004, 22:05
PM MAIL WWW ICQ   Вверх
<Spawn>
Дата 30.3.2004, 04:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



То есть это не твоя программа? Тогда сделай свою и при зафершении работы виды делай FindWindow + TerminateProcess

Это сообщение отредактировал(а) <Spawn> - 30.3.2004, 04:52


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
tippmann
Дата 30.3.2004, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.3.2004
Где: Ивантеевка

Репутация: нет
Всего: нет



<Spawn> - это моя программка. Просто я первый раз столкнулся с необходимостью завершить нормально прогу при перезагрузке винды. Вот собственно по этому за советом и пришел.
Еще раз вопрос, может даже поконкретней:
Если окно проги развернуто, при попытке перегрузиться прога завершается, а винда нет. Винда нормально завершится при повторном тычке на кнопке Перезагрузка. ИМХО моя программка перед самым завершением своей работы должна уведомить винду сообщением, что она типа закончила работу и можно перезагружаться. Что это за сообщение и когда (куда, кому) его лучше послать?
PM MAIL WWW ICQ   Вверх
RA
Дата 30.3.2004, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



А что за Процедура - cleanup ?
PM   Вверх
Maverick
Дата 30.3.2004, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: нет
Всего: 10



Цитата
А что за Процедура - cleanup ?


Вероятно пользовательская... По аналогии с FoxPro названо - при закрытии окна, там такая штука есть...


--------------------
smile
PM ICQ GTalk   Вверх
p0s0l
Дата 30.3.2004, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



RAdmin, Maverick, да вы что ? CleanUp же расписана в коде !

tippmann, попробуй сделать в конце CleanUp TerminateProcess(GetCurrentProcess); вместо Application.Terminate





--------------------
С уважением, г-н Посол.
PM   Вверх
tippmann
Дата 31.3.2004, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.3.2004
Где: Ивантеевка

Репутация: нет
Всего: нет



p0s0l
Спасибо. При чтении доки по TerminateProcess обнаружил что и Thread я не правильно завершал. НО проблему это НЕ решило...
Если окно проги активно - все ОК, срабатывает процедура FormCloseQuery и винда вместе с прогой завершаются.
Если прога свернута - ничего не происходит. Все остальные проги завершаются кроме моей...
Отсюда я делаю вывод, что проблема заключается в следующем: окно проги прячется функцией ShowWindow(Application.Handle, SW_HIDE); (бо я не хочу чтоб она висела в таскбаре). Т.е. остается только иконка в трее. Если не прятать таким образом окно, а просто сворачивать - все нормально.

Куда в таком случае Винда посылает сообщение на закрытие и как поймать это сообщение?

ЗЫ: Ведь полно таких прог, у которых только иконка в трее, и все у всех работает. Неужели никто не писал такое никогда?
Прога без исходников лежит тут http://baton.itkm.ru/progs.php ~720 Kb Исходники для D6 могу выслать почтой если кого заинтересует.

PM MAIL WWW ICQ   Вверх
RA
Дата 31.3.2004, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



А что нельзя просто Form1.visible:=false; ?
PM   Вверх
tippmann
Дата 31.3.2004, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.3.2004
Где: Ивантеевка

Репутация: нет
Всего: нет



Цитата
А что нельзя просто Form1.visible:=false; ?

Нельзя. Я ж ясно написал - не хочу чтоб прога была видна в таскбаре. Хочу чтоб только иконка была в трее.

PM MAIL WWW ICQ   Вверх
z-END
Дата 31.3.2004, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 1
Всего: 102



tippmann
попробуй вместо application.terminate делать ExitProccess(0);
у меня была похожая проблемма при работе с плагинами так вот ExitProccess очень помог.


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
RA
Дата 31.3.2004, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



tippmann э не внимательно тебя прочёл. Слух а программа под 9x чтоли ?
PM   Вверх
tippmann
Дата 31.3.2004, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.3.2004
Где: Ивантеевка

Репутация: нет
Всего: нет



RAdmin
Я ее пишу сидя в win 2000, а уж куда ее люди ставить будут - не мое дело...
По идее везде работать должно... Я там ничего такого специфичкого не использовал.
И с чего можно было взять что она под 9х?
PM MAIL WWW ICQ   Вверх
RA
Дата 31.3.2004, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



tippmann да ты про таскбар сказал вот я и подумал что под 9x biggrin.gif
PM   Вверх
tippmann
Дата 31.3.2004, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.3.2004
Где: Ивантеевка

Репутация: нет
Всего: нет



RAdmin
мдя, всех бывает подглючивает...

nJIaKca.spb
Спасибо!!! ExitProccess(0); и мне помог. Как раз то что нужно было...
Эх, поставил бы тебе плюсик, да мне пока не разрешають smile.gif

Для тех кто будет после меня колупаться:
при применении ExitProccess(0); даже если форма скрыта функцией ShowWindow(Application.Handle, SW_HIDE); и отсутствует в списке выполняемых приложений, происходит вызов процедуры FormCloseQuery, где можно сделать завершающие действия, и винда завершится нормально.

При использовании TerminateProcess(GetCurrentProcess,0); или application.terminate; этого не происходит. Винда нормально завершиться не может (если окно скрыто).

Да и ваабще как я понял использовать ExitProccess(0); предпочтительнее всего, бо он там сам еще кучу полезной работы делает типа отсоединения DLL и завершения Thread...


PM MAIL WWW ICQ   Вверх
p0s0l
Дата 1.4.2004, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



tippmann, поставлю плюсик nJIaKca.spb, раз тебе не позволено, а человек заслужил.


--------------------
С уважением, г-н Посол.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.