GTK + 3多线程(GTK+3 multithreading)

2019-10-18 07:37发布

我有一个程序(用C写的,目前在Mac OS X 10.8.4上运行)每秒模拟世界和更新世界状态多次。

在启动该程序创建它创建了一个简单的GTK窗口和调用后台线程gtk_main

世界上每个状态更新(在主线程)的时间后,我想窗口反映这种变化。 我的第一个方法是世界上被更新后,简单地更新GTK控件,但因为这是在不同的线程的事情打破了相当乱七八糟。

是否有某种机制,在主线程可以在图形线程更新一些状态,然后排队,提示图形线程重绘的事件吗? 即

void draw() {
    // This can only be called from the graphics thread.
    gtk_label_set(GTK_LABEL(label1), "some state");
}

// This causes draw() to be called on the graphics thread.
gtk_please_redraw_this_thing_on_the_graphics_thread();

有没有办法做到这一点? 或者说,它覆盖任何教程?

Answer 1:

原来,这是很简单的。

首先创建一个会做绘图(在图形线程)的功能:

gboolean draw_function(GtkWidget *w, GdkEventExpose *event) {
    // Draw things.
    return TRUE;
}

然后,在设置中,连接draw小工具的事件,您的绘制函数:

g_signal_connect(G_OBJECT(some_widget), "draw", G_CALLBACK(draw_function),  NULL);

最后,为了迫使小部件从另一个线程,你可以打电话重绘:

gtk_widget_queue_draw(some_widget);


文章来源: GTK+3 multithreading