Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows处理CTRL+;C在不同的线程中?_C++_Windows_Multithreading_Qt_Signals - Fatal编程技术网

C++ Windows处理CTRL+;C在不同的线程中?

C++ Windows处理CTRL+;C在不同的线程中?,c++,windows,multithreading,qt,signals,C++,Windows,Multithreading,Qt,Signals,下面是一个在linux和windows上处理CTRL+C信号的简单应用程序: #include <QtCore/QCoreApplication> #include <QDebug> #include <QThread> void SigIntHandler() { qDebug()<<"SigInt ThreadID: "<<QThread::currentThreadId(); qApp->quit(); }

下面是一个在linux和windows上处理CTRL+C信号的简单应用程序:

#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();
}
这就是我所期望的(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方法是在不同的线程中执行的,然后是main。。。这给我带来了很多问题。所以我的问题是-有可能强制SigIntHandler在windows的主线程中运行吗?我是不是看错了信号

谢谢

来自:

HandlerRoutine函数是一个应用程序定义的函数,与
setConsoletrlHandler
函数一起使用。控制台进程使用此功能处理进程接收到的控制信号。当接收到信号时,系统将在进程中创建一个新线程来执行该函数


因此,答案是:这是不可能的。

请阅读以下链接,了解对此的有趣看法:

uf。。。微软总是要与众不同:(谢谢你提供的信息;)这不是不可能的。在SetConsoleTrulHandler函数(在新线程中运行)设置的处理程序例程中,可以使用SetThreadContext函数操作主线程。这不适合胆小的人,需要一些装配知识,但这是可能的。这并不是说你希望在这方面的事情以Unix的方式进行。事实上,微软再次以正确的方式进行了这项工作。信号是Unix上最吸引人的特性之一。无需为每个函数定义信号异步安全性等。最后,在unix上的非平凡程序上,您通常只需增加一个信号量来运行另一个线程即可完成真正的工作。添加链接作为参考:感谢您的评论:)读过这篇文章后,看起来windows方式确实是一种更好的方式。。。不管怎样,我不在乎,我已经把我的程序修好了,可以在linux和windows上工作:)
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