gpt4 book ai didi

c++ - 如何将成员函数传递给 SetConsoleCtrlHandler()?

转载 作者:行者123 更新时间:2023-11-28 05:27:32 25 4
gpt4 key购买 nike

我有以下命令行应用程序代码(示例)。我想确保在 ctrl+c 事件中调用 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();
}

不过,请允许我重申:您需要更强大的功能才能实现不那么简单的应用程序。

关于c++ - 如何将成员函数传递给 SetConsoleCtrlHandler()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40239155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com