以下代码在我测试过的几乎Linux平台(Ubuntu,Mint,Raspbian x86)上都能完美执行,但在Raspbian for Raspberry 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;在尾部也会导致相同的错误,这对结果没有影响。
答案 0 :(得分:1)
我怀疑这是因为您的处理程序返回了void。来自g_timeout_add:
该函数被反复调用,直到返回FALSE,此时 点超时将被自动销毁,该功能将不会 被再次呼叫。
#include <gtk/gtk.h>
gboolean control_quick_timer_event(gpointer data)
{
printf("I'm still alive\n");
return TRUE;
}
int main (int argc, char *argv[])
{
gtk_init (&argc, &argv);
g_timeout_add(20, control_quick_timer_event, NULL);
gtk_main ();
return 0;
}