回调内的全局标志

时间:2012-07-23 14:34:27

标签: c++ c

我有一个与系统中的外部硬件通信的代码。根据外部硬件发送的事件,我的C源中的状态将发生变化。在系统启动期间发生了一些握手,并且需要根据握手将一些信息发送到其他模块。我在回调中设置了一些全局变量,但是观察到外部硬件发送了两次事件,这使得一些回调被调用了两次。这会破坏全局变量中的信息。

 int global_value = 0;
 int eventcb()
 {
    if (some condition)
          global_value = 1;
    else if (some condition)
          global_value = 2;
    else
          global_value = 0;
 }

第一次将上面的代码称为global_value = 1时,让我们说;下次调用回调时,条件将不存在,因此global_value将变为0.我不想使用另一个全局变量来跟踪调用此回调的次数,甚至是基于文件的方法(创建文件系统中的文件)。有没有最佳方法来处理这种情况?我无法控制外部硬件,只能将事件发送一次。

2 个答案:

答案 0 :(得分:0)

您可以实施队列。对于每个回调,可以创建具有global_value和一些其他参数的回调数据(例如,回调id等以识别回调)。 global_value的当前使用者可以从队列中选择数据并使用它并从队列中删除该项。我假设您有某种消费者正在从global_value对象中读取数据。

答案 1 :(得分:0)

int global_value = -1;
 int eventcb()
 {
    if (some condition && (global_value != -1) )
          global_value = 1;
    else if (some condition && (global_value != -1) )
          global_value = 2;
    else
          global_value = 0;
 }

如果全局处于初始状态,则基本上使状态转换

当然,您可以为if语句添加更多条件,以确保正确覆盖所有状态转换。