Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Можно ли определить завершение процесса?  (Прочитано 8753 раз)
0 Пользователей и 1 Гость смотрят эту тему.
BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« : 16-07-2008 15:54 » new

Доброго времени суток, уважаемые коллеги!

У меня имеется программа, в которой есть цикл ожидания события еще до основного конструктора:

Код:
while(1)
{
  DWORD dwRet = WaitForSingleObject(hSync, 0);
  if (dwRet == WAIT_OBJECT_0)
  {
    ResetEvent(hSync);
    break;
  }
  Sleep(200);
}

try
{
  Application->Initialize();
  Application->CreateForm(__classid(TForm1), &Form1);
}

Всё работает так как и задумывалось, но появилась проблема - если программа находится в цикле ожидания и в этот момент попытаться перезагрузить компьютер, то появится окошко с сообщением, что процесс не может завершиться самостоятельно. Очень нужно избежать этой ситуации, но пока никаких адекватных идей не нашлось.
Скажите, есть ли какая-то возможность на этом этапе отследить событие OnClose или сделать что-то еще, чтобы при перезагрузке система самостоятельно завершала процесс?
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 16-07-2008 16:33 » 

Прошу прощения за беспокойство. Проблема решена:

Код:
while(1)
{
  DWORD dwRet = WaitForSingleObject(hSync, 0);
  if (dwRet == WAIT_OBJECT_0)
  {
    ResetEvent(hSync);
    break;
  }
  Sleep(200);
  MSG msg;
  if( PeekMessage(&msg, NULL, WM_QUERYENDSESSION, WM_QUERYENDSESSION, PM_REMOVE) )
    return 0;
  if( PeekMessage(&msg, NULL, WM_ENDSESSION, WM_ENDSESSION, PM_REMOVE) )
    return 0;
}
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 19-04-2010 11:42 » 

Прикольно. В билдере такой код работает, а в делфи - нет.
Может я не правильно что-то делаю? Спасите помогите.
Вот код на паскале:

Код:
var
  Msg: TMsg;
.....

while true do
  begin

    if PeekMessage(Msg, 0, WM_QUERYENDSESSION, WM_QUERYENDSESSION, PM_REMOVE) = true then
      MessageBox(0, 'window message', '', MB_OK);

    if PeekMessage(Msg, 0, WM_ENDSESSION, WM_ENDSESSION, PM_REMOVE) = true then
      MessageBox(0, 'window message', '', MB_OK);

    Sleep(1000);
  end;
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 19-04-2010 11:47 » 

первым параметром идёт указатель на структуру, попробуй ..(@Msg, ...
Записан

BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 20-04-2010 15:38 » 

Проблема снова решена Улыбаюсь  Оказывается, что сообщения получает только основной поток, а я поместил этот фрагмент в дочерний.
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines