Gtk2多线程gdk_pixbuf_get_from_drawable问题

时间:2015-07-09 00:33:34

标签: c multithreading gtk gdk

你好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. gdk_threads_init()
  3. gtk_init(0, null)
  4. gdk_threads_enter()
  5. gdk_pixbuf_get_from_drawable(....)
  6. gdk_threads_leave()
  7. 所以这很好用,但每当我的用户点击按钮进行屏幕截图时,我再次执行所有这些功能。所以我的问题是:

    1. 多次运行gdk_threads_init是否安全?线程从未被破坏所以我不应该正确运行它?但如果我这样做是否安全?
    2. 可以多次运行gtk_init(0, null)吗?
    3. 我问这个的原因是因为当我通过反复调用该函数进行测试时,通常在第二次应用程序减慢并最终崩溃并显示消息:

        

      编程接收信号SIGSEGV,分段故障。

           来自/usr/lib/x86_64-linux-gnu/libX11.so.6的XGetImage()中的

      0x00007f09382138b4

1 个答案:

答案 0 :(得分:3)

你不应该需要这些; Firefox会为你做gtk_init,如果你在主线程上,你不需要任何线程的东西。如果FF确实使用GDK线程,那么你可能需要的最多就是输入和离开。

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