我正在开发一个简单的界面,它使用GTK3和C模拟一个led,当我收到一个命令时,"led“打开或根据命令关闭。我在绘图区域使用Cairo绘制一个代表我的led的圆圈,并在我的超时值函数中使用gtk_widget_queue_draw_area更新屏幕。一段时间后,我的CPU使用率在我的应用程序中增加到100%。
当我收到命令时,我调用下面的函数
void update_status_led(int led, int status_led)
{
g_signal_connect(G_OBJECT(darea[led]), "draw", G_CALLBACK(on_draw_event_leds), GINT_TO_POINTER(status_led));
}因此回调函数"on_draw_event_leds“被调用
gboolean on_draw_event_leds(GtkWidget *widget, cairo_t *cr,
gpointer user_data)
{
set_status_led(cr, GPOINTER_TO_INT(user_data));
return FALSE;
}因此它将函数称为"set_status_led“。
void set_status_led(cairo_t *cr, int status)
{
printf("update status led: %d\n", countref++);
cairo_reference(cr);
cairo_set_line_width(cr, 2);
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_arc(cr, 9, 9, 7, 0, 2 * M_PI);
if (status>0)
{
cairo_set_source_rgb(cr, 1, 0, 0); //red
}
else
{
cairo_set_source_rgb(cr, 0, 0, 0); //black
}
cairo_fill(cr);
cairo_stroke(cr);
cairo_destroy(cr);
}我使用“printf”(“update状态引导:%d\n",countref++);”知道我的函数被调用了多少次,日志在下面打印了多少次
New Connection from 127.0.0.1:34589
1 Command Received
update status led: 6
update status led: 7
1 Command Received
update status led: 8
update status led: 9
update status led: 10
1 Command Received
update status led: 11
update status led: 12
update status led: 13
update status led: 14
1 Command Received
update status led: 15
update status led: 16
update status led: 17
update status led: 18
update status led: 19
1 Command Received
update status led: 20
update status led: 21
update status led: 22
update status led: 23
update status led: 24
update status led: 25
1 Command Received
...可以看到,我只收到一个命令,我的回调函数on_draw_event_leds被多次调用,每次接收到的命令都会增加一个调用,因为以前的cairo没有被删除,gtk_widget_queue_draw_area再次呈现它们。
有人能帮我吗?
谢谢,
发布于 2016-05-15 22:30:05
g_signal_connect()函数只是说“发生此事件时,执行此函数”。您可能会将其混淆为gtk_widget_queue_draw(),它实际上会导致小部件被重新绘制。
从某种程度上说,与直觉相反的是,信号连接很多-很多.这意味着任意数量的函数都可以连接到同一个信号,当发出信号时,所有函数都会被调用。因为您反复调用g_signal_connect(),所以可以获得到绘图函数的多个连接,因此该绘图函数将被多次调用。
因此,您想要做的是将g_signal_connect()移到初始化代码中,因为信号通常是连接信号的地方,并且在update_status_led()中有gtk_widget_queue_draw() (或类似的函数)。
https://stackoverflow.com/questions/37117363
复制相似问题