[英]How to pass member function to SetConsoleCtrlHandler()?
我有以下用于命令行应用程序的代码(示例)。 我想确保在ctrl + c Event上调用Disconnect。 这就是为什么我添加处理程序。 我可以使CtrlHandler成为成员函数,以便在按ctrl + c时,该处理程序具有有效的Foo
对象来调用Disconnect()
吗?
#include <windows.h>
class Foo
{
public :
Foo()
{
Connect();
}
virtual ~Foo()
{
Disconnect();
}
protected:
Run();
Connect();
Disconnect();
};
BOOL CtrlHandler(DWORD fdwCtrlType)
{
switch (fdwCtrlType)
{
// Handle the CTRL-C signal.
case CTRL_C_EVENT:
//Disconnect somehow
return(TRUE);
default:
return FALSE;
}
}
int main(int argc, char* argv[])
{
SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE );
Foo myFoo;
myFoo.Run();
}
您唯一的选择是自己管理回调的上下文。 在单线程应用程序一个非常简单的方法,即Run
不重新输入可以。
#include <windows.h>
class Foo
{
public :
Foo()
{
Connect();
}
virtual ~Foo()
{
Disconnect();
}
protected:
static Foo* current_foo;
static BOOL CtrlHandler(DWORD fdwCtrlType)
{
switch (fdwCtrlType)
{
// Handle the CTRL-C signal.
case CTRL_C_EVENT:
current_foo->Disconnect();
return(TRUE);
default:
return FALSE;
}
}
Run() {
Foo::current_foo = this;
SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE );
// Other things
}
Connect();
Disconnect();
};
Foo* Foo::current_foo = nullptr;
int main(int argc, char* argv[])
{
Foo myFoo;
myFoo.Run();
}
但是,请允许我重申一下:对于不那么琐碎的应用程序,您将需要更强大的功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.