c ++ - Windows håndtering CTRL + C i forskellige tråd?

Indlæg af Hanne Mølgaard Plasc

Problem



Her er en simpel applikation, der håndterede CTRL + C signalboks på linux og 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();
}


Efter at jeg har compiled og kørt den på linux (Debian Squeeze) får jeg følgende output:


/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 


Og det er det jeg har forventet (SigIntHandler-metoden kører på hovedtråd). Men når jeg kompilerer og udfører samme kode på Windows 7, får jeg det her:


d:Test-build-desktopdebug>Test.exe
Main ThreadID:  0x5a8
SigInt ThreadID:  0x768

d:Test-build-desktopdebug>Test.exe
Main ThreadID:  0x588
SigInt ThreadID:  0x1434

d:Test-build-desktopdebug>Test.exe
Main ThreadID:  0x1170
SigInt ThreadID:  0xc38


Som du kan se, udføres SigIntHandler-metoden i en anden tråd end hoved ... Og det skaber mig mange problemer. Så mit spørgsmål er - er det muligt at tvinge SigIntHandler til at køre i hovedtråd på Windows? Får jeg måske at se forkert?


Tak !!

Bedste reference


Fra MSDN emne HandlerRoutine:


En HandlerRoutine-funktion er en applikationsdefineret funktion, der anvendes med funktionen SetConsoleCtrlHandler. En konsolproces bruger denne funktion til at håndtere styresignaler, der modtages af processen. Når signalet er modtaget, opretter systemet en ny tråd i processen for at udføre funktionen.


Så svaret er: dette er umuligt.

Andre referencer 1


Læs følgende link for en interessant udgave: http://blogs.msdn.com/b/oldnewthing/archive/2008/07/28/8781423.aspx[4]