Windows обрабатывает CTRL + C в другой теме? - PullRequest
7 голосов
/ 13 сентября 2011

Вот простое приложение, которое обрабатывало сигнальную будку CTRL + C в Linux и Windows:

#include <QtCore/QCoreApplication>
#include <QDebug>
#include <QThread>

void SigIntHandler()
{
    qDebug()<<"SigInt ThreadID: "<<QThread::currentThreadId();
    qApp->quit();
}

#ifdef __linux__
#include <signal.h>

    void unix_handler(int s)
    {
        //svakako je SIGINT, ali da ne javlja warning da se s ne koristi
        if (s==SIGINT)
            SigIntHandler();
    }

#else
#include <windows.h>

    BOOL WINAPI WinHandler(DWORD CEvent)
    {
        switch(CEvent)
        {
        case CTRL_C_EVENT:
            SigIntHandler();
            break;
        }
        return TRUE;
    }

#endif

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);


    //kod za hvatanje CTRL+C - unix i windows
    #ifdef __linux__
        signal(SIGINT, &unix_handler);
    #else
        SetConsoleCtrlHandler((PHANDLER_ROUTINE)WinHandler, TRUE);
    #endif

    qDebug()<<"Main ThreadID: "<<QThread::currentThreadId();
    return a.exec();
}

После компиляции и запуска в Linux (Debian Squeeze) я получаю следующий вывод:

/Test-build-desktop$ ./Test 
Main ThreadID:  140105475446560 
^CSigInt ThreadID:  140105475446560 

/Test-build-desktop$ ./Test 
Main ThreadID:  140369579480864 
^CSigInt ThreadID:  140369579480864 

/Test-build-desktop$ ./Test 
Main ThreadID:  140571925509920 
^CSigInt ThreadID:  140571925509920 

И это то, что я ожидал (метод SigIntHandler работает в основном потоке). Но когда я компилирую и выполняю тот же код в Windows 7, я получаю следующее:

d:\Test-build-desktop\debug>Test.exe
Main ThreadID:  0x5a8
SigInt ThreadID:  0x768

d:\Test-build-desktop\debug>Test.exe
Main ThreadID:  0x588
SigInt ThreadID:  0x1434

d:\Test-build-desktop\debug>Test.exe
Main ThreadID:  0x1170
SigInt ThreadID:  0xc38

Как видите, здесь метод SigIntHandler выполняется в другом потоке, отличном от основного ... И это создает много проблем. Поэтому мой вопрос - возможно ли заставить SigIntHandler запускаться в основном потоке на Windows? Может быть, я неправильно улавливаю?

Спасибо !!

Ответы [ 2 ]

10 голосов
/ 13 сентября 2011

Из темы MSDN HandlerRoutine:

Функция HandlerRoutine - это определяемая приложением функция, используемая с функцией SetConsoleCtrlHandler.Консольный процесс использует эту функцию для обработки сигналов управления, полученных процессом.Когда сигнал получен, система создает новый поток в процессе для выполнения функции.

Итак, ответ таков: это невозможно.

5 голосов
/ 13 сентября 2011

Прочитайте следующую ссылку для интересного взгляда на это: http://blogs.msdn.com/b/oldnewthing/archive/2008/07/28/8781423.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...