首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用cairo绘制区域

使用cairo绘制区域
EN

Stack Overflow用户
提问于 2016-05-09 13:43:25
回答 1查看 438关注 0票数 0

我正在开发一个简单的界面,它使用GTK3和C模拟一个led,当我收到一个命令时,"led“打开或根据命令关闭。我在绘图区域使用Cairo绘制一个代表我的led的圆圈,并在我的超时值函数中使用gtk_widget_queue_draw_area更新屏幕。一段时间后,我的CPU使用率在我的应用程序中增加到100%。

当我收到命令时,我调用下面的函数

代码语言:javascript
复制
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“被调用

代码语言:javascript
复制
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“。

代码语言:javascript
复制
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++);”知道我的函数被调用了多少次,日志在下面打印了多少次

代码语言:javascript
复制
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再次呈现它们。

有人能帮我吗?

谢谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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() (或类似的函数)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37117363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档