Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WM_QUIT в консольном приложении 
:(
    Опции темы
GipsySh
  Дата 5.2.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 6.2.2007

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



Даже неудобно спрашивать, но тем не менее... В каком случае (при нажатии какой клавиши/сочетания клавиш) в консольное приложение посылается сообщение WM_QUIT?
У меня есть консольное приложение, в котором среди прочего создается таймер. Соответсвенно, пробую организовать вот такой цикл:
Код

while (GetMessage(&Msg, NULL, 0, 0)) {

        switch (Msg.message)
        {
        case WM_TIMER:
            b = true;
            break;
        case WM_QUIT:
            PostQuitMessage(0);
            fclose(szFileName);                   // закрываю созданный ранее файл
            KillTimer(NULL, TIMER_ID);        // удаляю таймер
            break;
        default:
            b = false;
        }

    DispatchMessage(&Msg);
}


Закрыть приложение получается только либо закрыв консоль (крестиком в заголовке), либо нажав Ctrl+C... Но не понимаю, приходит ли при этом сообщение WM_QUIT.
Попробовала поставить бряк на case WM_QUIT и отладиться - но в итоге при попытке закрыть приложение указанными двумя способами получаю exception в дебаге  smile  
PM MAIL   Вверх
Lazin
Дата 5.2.2010, 16:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(GipsySh @  5.2.2010,  15:53 Найти цитируемый пост)
Даже неудобно спрашивать, но тем не менее... В каком случае (при нажатии какой клавиши/сочетания клавиш) в консольное приложение посылается сообщение WM_QUIT?

ни в каком

для этого есть ф-я SetConsoleCtrlHandler

PM MAIL Skype GTalk   Вверх
GipsySh
Дата 17.2.2010, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 6.2.2007

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



Lazin, спасибо, что указали на функцию SetConsoleCtrlHandler... 
Но у меня теперь не получается ее совместить с таймером... 
Добавила функцию для обработки сигналов:
Код

BOOL CtrlHandler(DWORD dwCtrlType )
{
    switch (dwCtrlType)
    {
    case CTRL_C_EVENT:
        printf("Ctrl-C event\n\n");
        fclose(szFileName);
        return(TRUE);

    case CTRL_CLOSE_EVENT:
        printf("Ctrl-Close event\n\n");
        fclose(szFileName);
        return(TRUE);
        
    case CTRL_BREAK_EVENT:
        printf("Ctrl-Break event\n\n");
        fclose(szFileName);
        return(FALSE);

    case CTRL_LOGOFF_EVENT: 
        printf("Ctrl-Logoff event\n\n");
        fclose(szFileName);
        return(FALSE);

    case CTRL_SHUTDOWN_EVENT: 
        printf("Ctrl-Shutdwon event\n\n");
        fclose(szFileName);
        return(FALSE); 

    default:
        return(FALSE);
    }
}

А потом пишу в main'е:
Код

if (!SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE))
    {
        printf("(MAIN): Unable to install handler!\n");
        return -1;
    }

    UINT iTimerID = SetTimer(NULL, TIMER_ID, iTimeInterval * 1000, (TIMERPROC)TimerProc);

    if (!iTimerID)
        return 16;

    bool b = true;

    while (GetMessage(&Msg, NULL, 0, 0)) {

        if (Msg.message == WM_TIMER && Msg.wParam == iTimerID)
            b = true;
        else
            b = false;
    
        DispatchMessage(&Msg);
    }

                KillTimer(NULL, TIMER_ID);


В результате когда пытаешься закрыть консольное приложение, нажав на крестик, все это творение валится (вылетает окно с кнопками "End Now" и "Cancel")  smile 

Никто не сталкивался с аналогичной проблемой? 

Это сообщение отредактировал(а) GipsySh - 17.2.2010, 23:34
PM MAIL   Вверх
GipsySh
Дата 19.2.2010, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 6.2.2007

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



Как вариант еще попробовала использовать atexit, но SetConsoleCtrlHandler, если я правильно понимаю, предоставляет возможность обработать больше ситуаций, поэтому хотелось бы все-таки разобраться с ним... :(
PM MAIL   Вверх
Lazin
Дата 19.2.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(GipsySh @  17.2.2010,  23:31 Найти цитируемый пост)
В результате когда пытаешься закрыть консольное приложение, нажав на крестик, все это творение валится (вылетает окно с кнопками "End Now" и "Cancel")

могу посоветовать запустить под отладчиком, установить брэйкпоинт в ф-ю CtrlHandler, закрыть консоль и посмотреть что будет дальше =)

Добавлено через 2 минуты и 57 секунд
мне кажется, нужно не только файл закрывать, но и убивать таймер - KillTimer(NULL, iTimerID);
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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