cpp中的运行时事件处理程序?

时间:2015-07-01 21:21:46

标签: c++ annotations

在cpp项目上工作,我需要运行时事件处理程序。我的主要目标是跟踪示例程序中发生的各种事件,并基于事件特定处理程序的触发。

这些事件触发处理程序/函数对示例程序的全局目标没有任何贡献,但只是跟踪cpp示例程序中的各种事件。

我的问题是,在cpp中创建类似自定义事件处理程序的东西是不可能的? 如果是,是否有任何创建此类自定义事件处理程序的教程?

例如: 事件就像在循环中输入失败一样。成功进入while循环,创建对象,删除对象,更改全局变量等。

2 个答案:

答案 0 :(得分:0)

最简单的事件处理程序形式是已注册的回调函数指针:

enum Events {
    FailedEnteringWhileLoop ,
    SuccessfullyEnteredWhileLoop ,
};

typedef void(EventHandler*)(Events);
 void MyEventHandler(Events ev) {
    switch(ev) {
    case FailedEnteringWhileLoop:
        // Do something
        break;
    case SuccessfullyEnteredWhileLoop:
        // Do something
        break;
    }
 }
EventHandler evh = MyEventHandler;
bool whileLoopEntered = false;
while(condition) {
    if(!whileLoopEntered) {
        whileLoopEntered = true;
        (*evh)(SuccessfullyEnteredWhileLoop);
    }
}

if(!whileLoopEntered) {
    (*evh)(FailedEnteringWhileLoop);
}

答案 1 :(得分:0)

  

我正在寻找像循环中输入失败的事件。顺利   进入while循环,创建对象,删除对象,更改全局   变量等。

C ++语言本身并不像“事件”那样跟踪这些事情。一般来说,它不会提供跨代码发生的各种基本活动的钩子。

因此,要满足您的要求,需要自己构建基础架构并以各种方式将其用于代码。 (或者找到已经完成同样工作的其他人并使其可用。虽然你仍然需要将它集成到你的代码中。)

要了解可能需要做些什么:

要创建和删除对象,您可以覆盖newdelete运算符。但这不包括堆栈/本地/ etc对象。否则,你可以楔入你想要跟踪的每个类的构造函数和析构函数,或者甚至将它们全部派生出一个封装跟踪的公共基类。

对于变量的更改,您必须将该变量包装在一个容器中,该容器仅显示通过成员函数更改它的能力。然后这些可以被编码以引发事件。

进入循环......你运气不好,因为循环不是可以扩展或挂钩的实体。你真的必须在你想要跟踪的每个循环上进行某种调用。

对于其他基础架构,您可能最终会做一些事情,比如让所有这些“事件”调用某种全局日志记录对象。如果你需要不同的东西在程序的过程中捕获不同的事件,那么你可能还需要构建一种注册和取消注册监听器的方式(监听器本身基于一个接口来派生或者std :: function或者其他什么适合您的使用案例)。

但最终由于语言没有提供开箱即用的方式,您可能需要重新考虑您真正想要的内容以及您希望通过它实现的目标。事实上,你可能最好不要问你如何实现你想要的最终目标,而不是如何做这个“事件”系统。