【问题标题】:Runtime event handler in cpp?cpp中的运行时事件处理程序?
【发布时间】:2015-07-01 21:21:46
【问题描述】:

在一个 cpp 项目上工作,我需要运行时事件处理程序之类的东西。我的主要目标是跟踪示例程序中发生的各种事件,并根据触发特定处理程序的事件。

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

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

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

【问题讨论】:

  • 我不确定您对术语 运行时注释 的含义是什么:-P ...您能否详细说明一下,最好显示一个代码示例'正在努力实现?
  • @πάνταῥεῖ 是的。没有像运行时注释这样的东西,但我想实现一些类似于在运行时工作的事件处理程序的东西。很抱歉,如果您使用注释一词使您感到困惑。
  • 这个词到底是什么意思??不过,有很多技术可用于实现事件处理程序(同步甚至异步)。起点应该是提供一些事件源/接收器接口,并声明什么应该是事件。有关此类技术的更复杂示例,请查看例如我的STTCL 状态模式框架。您的问题似乎很宽泛,在这里可以简明扼要地回答。
  • @πάνταῥεῖ 你可以刷新我的问题。我正在寻找无法进入 while 循环之类的事件。成功进入while循环,创建对象,删除对象,修改全局变量等
  • "... 诸如未能进入 while 循环之类的事件..." 这没有任何意义,没有看到您实际尝试执行的代码.

标签: c++ annotations


【解决方案1】:

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

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);
}

【讨论】:

    【解决方案2】:

    我正在寻找无法进入 while 循环之类的事件。成功地 进入while循环,创建对象,删除对象,更改全局 变量等。

    C++ 语言本身不会将这类事情作为“事件”进行跟踪。一般来说,它不提供任何跨代码发生的各种基本活动的挂钩。

    因此,要满足您的要求,您需要自己构建基础架构并以各种方式将其融入您的代码中。 (或者找其他人已经完成了相同类型的工作并使其可用。尽管您仍然必须将其集成到您的代码中。)

    给出一些可能需要做的事情的想法:

    要创建和删除对象,您可以覆盖 newdelete 运算符。但这不包括堆栈/本地/等对象。否则,您可以在要跟踪的每个类的构造函数和析构函数中插入一些东西,甚至让它们都派生自一个封装了跟踪的公共基类。

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

    对于进入循环...您很不走运,因为循环不是可以扩展或挂钩的实体。实际上,您必须在要跟踪的每个循环中进行某种调用。

    至于基础设施的其余部分,您可能最终会做一些事情,比如让所有这些不同的“事件”调用某种全局日志对象。如果您需要不同的东西在程序过程中捕获不同的事件,那么您可能还需要构建一种注册和取消注册侦听器的方法(侦听器本身基于派生自 std::function 或其他接口的接口适合您的用例)。

    但最后,由于该语言没有提供开箱即用的方式,您可能需要重新考虑您真正想要什么以及您希望用它实现什么。实际上,您最好用如何实现您想要的最终目标而不是如何执行此“事件”系统来提出问题。

    【讨论】:

      猜你喜欢
      • 2013-04-09
      • 2016-03-22
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多