1

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

在启动时,该程序会创建一个后台线程,该线程会创建一个简单的 GTK 窗口并调用gtk_main.

每次更新世界状态后(在主线程中),我希望窗口反映这种变化。我的第一种方法是在世界更新后简单地更新 GTK 小部件,但因为那是在不同的线程中,所以事情变得非常混乱。

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

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();

有没有办法做到这一点?或者任何涵盖它的教程?

4

1 回答 1

2

事实证明这很简单。

首先创建将进行绘图的函数(在图形线程上):

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);
于 2013-07-03T22:04:43.030 回答