你好GTKers同伴
我正处于为Firefox编写插件的情况,这是一个GTK2应用程序。我需要执行gdk_pixbuf_get_from_drawable
,现在这个函数需要在主线程上运行。
我读过这篇文章:http://blogs.operationaldynamics.com/andrew/software/gnome-desktop/gtk-thread-awareness
并且知道要从我的主题中调用这个,我必须先调用:
g_threads_init()
- 我不这样做,因为我无法在libgdk-x11-2.0.so.0
或libgtk-x11-2.0.so.0
中找到此功能gdk_threads_init()
gtk_init(0, null)
gdk_threads_enter()
gdk_pixbuf_get_from_drawable(....)
gdk_threads_leave()
所以这很好用,但每当我的用户点击按钮进行屏幕截图时,我再次执行所有这些功能。所以我的问题是:
gdk_threads_init
是否安全?线程从未被破坏所以我不应该正确运行它?但如果我这样做是否安全?gtk_init(0, null)
吗?我问这个的原因是因为当我通过反复调用该函数进行测试时,通常在第二次应用程序减慢并最终崩溃并显示消息:
编程接收信号SIGSEGV,分段故障。
来自/usr/lib/x86_64-linux-gnu/libX11.so.6的XGetImage()中的0x00007f09382138b4
答案 0 :(得分:3)
你不应该需要这些; Firefox会为你做gtk_init,如果你在主线程上,你不需要任何线程的东西。如果FF确实使用GDK线程,那么你可能需要的最多就是输入和离开。
段错误很可能是由无关的错误引起的。尝试设置MALLOC_CHECK_ = 2并在gdb中运行,或尝试在valgrind下运行,以查找内存错误。