gpt4 book ai didi

c - 为什么我的 GTK+ widget 的 expose 事件在很长时间后会被卡住?它是 GTK+ 错误吗?

转载 作者:太空宇宙 更新时间:2023-11-04 02:19:12 24 4
gpt4 key购买 nike

这是我的代码:

#include <gtk/gtk.h>

static int counter = 0;
static PangoLayout* layout;
static GdkGC* gc1;
static GdkGC* gc2;
//**/static GMutex* mu;

static gboolean on_expose_event(GtkWidget* widget, GdkEventExpose* event)
{
gchar the_string[20];

//**/g_mutex_lock(mu);
gdk_draw_rectangle(GDK_DRAWABLE(widget->window), gc1, TRUE, 0, 0, widget->allocation.width, widget->allocation.height);
snprintf(the_string, 20, "%d", counter);
pango_layout_set_text(layout, the_string, -1);
gdk_draw_layout(GDK_DRAWABLE(widget->window), gc2, 180, 120, layout);
//**/g_mutex_unlock(mu);

g_print (".");
return FALSE;
}

gpointer func(gpointer data)
{
//**/g_usleep(10000);
GdkWindow* window = GDK_WINDOW(data);
while(TRUE)
{
gdk_window_invalidate_rect(window, NULL, FALSE);
//**/gdk_window_process_updates(window, FALSE);
if(counter % 100 == 0) g_print("X");
g_usleep(10);
++counter;
}
return FALSE;
}

int main(int argc, char** argv)
{
GtkWidget* window;
GtkWidget* drawer;
GdkColormap* colormap;
GdkColor color;

g_thread_init(NULL);
gdk_threads_init();
gtk_init(&argc, &argv);

//:Create widgets and
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
drawer = gtk_drawing_area_new();
gtk_widget_set_size_request(drawer, 400, 300);
gtk_container_add(GTK_CONTAINER(window), drawer);
//.

gtk_widget_show_all(window);

//:Initializing Graphic Contexts
colormap = gtk_widget_get_colormap(GTK_WIDGET(drawer));
layout = gtk_widget_create_pango_layout(GTK_WIDGET(drawer), NULL);
gc1 = gdk_gc_new(GDK_DRAWABLE(GTK_WIDGET(drawer)->window));
gc2 = gdk_gc_new(GDK_DRAWABLE(GTK_WIDGET(drawer)->window));
gdk_color_parse("#000", &color);
gdk_colormap_alloc_color(colormap, &color, FALSE, TRUE);
gdk_gc_set_background(gc1, &color);
gdk_color_parse("#fff", &color);
gdk_colormap_alloc_color(colormap, &color, FALSE, TRUE);
gdk_gc_set_foreground(gc2, &color);
//.

g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(drawer), "expose_event", G_CALLBACK(on_expose_event), NULL);

//**/mu = g_mutex_new();
//Run the problematic thread!
g_thread_create(func, GTK_WIDGET(drawer)->window, TRUE, NULL);

gdk_threads_enter();
gtk_main();
gdk_threads_leave();

//**/g_mutex_free(mu);
return 0;
}

这是一个多线程程序,并没有做任何特别的事情!它只是强制 GtkDrawingArea 从主线程(GTK+ 主循环)重新绘制自身。

我的问题(或 GTK+ 问题!)是长时间运行后(可能是 0.5、1 或 4 分钟!),公开事件将不起作用(在我调整整个窗口的大小之前不响应我的请求!)!请编译并运行代码来检查这种情况。我添加了一些可能有帮助的打印命令!但由于我的经验不足,我无法检测到问题。

我希望这个程序几乎总是能重绘它的上下文,但它没有(或不能)。我能做些什么来解决这个问题?也许我应该向 GTK+ 开发人员报告错误?

我正在使用 Debian + GCC + GTK2.20

最佳答案

很可能,您需要用 gdk_threads_enter()/gdk_threads_leave() 对包围您的 gdk_window_invalidate_rect() 调用。阅读 gdk threads有关 gtk 和线程的更多信息。看看那里的例子。

关于c - 为什么我的 GTK+ widget 的 expose 事件在很长时间后会被卡住?它是 GTK+ 错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3456802/

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