Raspberry pi GTK:g_timeout_add()树莓皮

Raspberry pi GTK:g_timeout_add()树莓皮,raspberry-pi,gtk3,Raspberry Pi,Gtk3,以下代码在我测试过的几乎所有linux平台(Ubuntu、Mint、Raspbianx86)上都能完美执行,但在RaspbianforRaspberryPI上完全失败 它成功地随机执行了几次,然后停止触发。程序的其余部分执行得很好,包括以完全相同的方式添加的几个其他超时,其他任何部分都不会以任何明显的方式受到影响 这可能是覆盆子pi无法跟上的5毫秒超时吗?为什么只有一个方面出现了故障,而所有其他方面都没有显示出故障等。就好像超时是由于某种原因被取消了一样 void control_init()

以下代码在我测试过的几乎所有linux平台(Ubuntu、Mint、Raspbianx86)上都能完美执行,但在RaspbianforRaspberryPI上完全失败

它成功地随机执行了几次,然后停止触发。程序的其余部分执行得很好,包括以完全相同的方式添加的几个其他超时,其他任何部分都不会以任何明显的方式受到影响

这可能是覆盆子pi无法跟上的5毫秒超时吗?为什么只有一个方面出现了故障,而所有其他方面都没有显示出故障等。就好像超时是由于某种原因被取消了一样

void control_init() {

...

  g_timeout_add(20, control_quick_timer_event, NULL);

...

}



void control_quick_timer_event() {

  control_read_values();

  control_since_last++;

  if (control_since_last == 2) {

    while (serialDataAvail(control_serial)) {

      serialGetchar(control_serial);

    }

    control_read_state = -1;
  }
}
*编辑* printf的附加值(“\n”);“修复”这个问题的原因不明,但我不能接受它作为一个解决方案,因为我需要没有数百万空间的串行打印输出


返回True/返回1;在尾部也会导致相同的错误,这对结果没有影响。

我怀疑这是因为处理程序返回void。发件人:

该函数被反复调用,直到返回FALSE,此时 超时点会自动销毁,且函数不会 再次被呼叫

#包括
gboolean控件\快速\计时器\事件(gpointer数据)
{
printf(“我还活着”\n);
返回TRUE;
}
int main(int argc,char*argv[])
{
gtk_init(&argc,&argv);
g\u超时\u添加(20,控制\u快速\u计时器\u事件,空);
gtk_main();
返回0;
}

就像@pan mroku试图告诉您的一样,您需要以下代码:

bool control_quick_timer_event() {

  control_read_values();

  control_since_last++;

  if (control_since_last == 2) {

    while (serialDataAvail(control_serial)) {

      serialGetchar(control_serial);

    }

    control_read_state = -1;
  }
return True;
}

如果不
返回True
,超时将被取消。

添加printf(“\n”);在控制结束时,快速计时器事件()是否足以维持循环?这是GTK经常遇到的问题,GTK要求在不清楚的位置使用这些无用的打印新行命令。发生什么事了?请发封邮件。您现在所拥有的是不可验证的,并且可能错误存在于代码的其余部分,而不存在于您发布的代码中。根据Gtk3文档,这段代码几乎肯定不起作用。它已经在Debian Squence上工作了10年。然后我将代码迁移到升级后的系统中,所有这些地方都开始爆炸。这就是我发现g_timeout回调需要有特定定义的原因(我继承了这段代码)。您的原始代码没有在我的机器上编译
没有已知的第二个参数从'void()'到'GSourceFunc'(也称为'int(*)(void*)的转换
)。那些有printf补丁的地方呢?三天来,我一直在调试堆栈损坏,直到找到问题的根源;)如果你有错误信息,你也应该发布这些信息。我们看不到你在看什么。如果您没有发布所有错误,我们将无法帮助您,然后您的StackOverflow帐户将被关闭。请使用注释中的错误编辑您的问题。关于我添加到原始问题中的注释,添加的行如何纠正该问题?您正在传递函数,该函数返回
void
,返回预期的
bool
。编译器让它通过可能是因为gtk中的回调被强制转换为
void*
(如果我没记错的话),但它仍然是一种未定义的行为
printf
有助于解决未定义的行为,而不是修复。我将添加一些工作代码。恐怕这个解决方案不起作用,返回true与否没有关系。还要注意的是,代码的工作原理与最初在任何其他平台上显示的一样,因此奇怪的是,这就是它在本例中失败的原因。当然,还要将
void
更改为
bool
。对不起,我通常用Python编写代码,但工作原理有点不同。
bool control_quick_timer_event() {

  control_read_values();

  control_since_last++;

  if (control_since_last == 2) {

    while (serialDataAvail(control_serial)) {

      serialGetchar(control_serial);

    }

    control_read_state = -1;
  }
return True;
}