C++ Windows处理CTRL+;C在不同的线程中?
下面是一个在linux和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(); }
#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