Gtk2 多线程 gdk_pixbuf_get_from_drawable 问题

Gtk2 Multi Thread gdk_pixbuf_get_from_drawable Questions

大家好 GTKers

我正在为 Firefox 编写插件,这是一个 GTK2 应用程序。我需要执行gdk_pixbuf_get_from_drawable,现在这个函数需要在主线程上运行。

我读了这篇文章:http://blogs.operationaldynamics.com/andrew/software/gnome-desktop/gtk-thread-awareness

并了解到要从我的线程中调用它,我必须先调用:

  1. g_threads_init() - 我没有这样做,因为我找不到在 libgdk-x11-2.0.so.0libgtk-x11-2.0.so.0
  2. 中定义的这个函数
  3. gdk_threads_init()
  4. gtk_init(0, null)
  5. gdk_threads_enter()
  6. gdk_pixbuf_get_from_drawable(....)
  7. gdk_threads_leave()

所以这工作正常,但每次我的用户单击按钮进行屏幕截图时,我都会再次执行所有这些功能。所以我的问题是:

  1. 多次运行gdk_threads_init安全吗?线程从未被破坏所以我不应该 运行 对吧?但是这样做安全吗?
  2. 多次运行gtk_init(0, null)可以吗?

我问这个的原因是因为当我通过重复调用该函数进行测试时,通常在第二次后应用程序变慢并最终崩溃并显示消息:

Program received signal SIGSEGV, Segmentation fault.

0x00007f09382138b4 in XGetImage () from /usr/lib/x86_64-linux-gnu/libX11.so.6

你不应该需要这些; Firefox 会为您完成 gtk_init,如果您在主线程上,则不需要任何线程内容。如果 FF 确实使用 GDK 线程的东西,你可能需要的最多就是进入和离开。

段错误很可能是由不相关的错误引起的。尝试在 gdb 中设置 MALLOC_CHECK_=2 和 运行,或尝试在 valgrind 下设置 运行,以查找内存错误。