gpt4 book ai didi

c - GTK+3 多线程

转载 作者:太空宇宙 更新时间:2023-11-04 03:54:53 26 4
gpt4 key购买 nike

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

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

每次世界状态更新后(在主线程中),我希望窗口反射(reflect)该变化。我的第一个方法是在世界更新后简单地更新 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();

有什么办法吗?或者任何涵盖它的教程?

最佳答案

事实证明这很简单。

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

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

关于c - GTK+3 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17439933/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com