C Gtk2多线程gdk_pixbuf_从可绘制问题获取_
嗨,哥们 我正在为Firefox编写一个插件,这是一个GTK2应用程序。我需要执行C Gtk2多线程gdk_pixbuf_从可绘制问题获取_,c,multithreading,gtk,gdk,C,Multithreading,Gtk,Gdk,嗨,哥们 我正在为Firefox编写一个插件,这是一个GTK2应用程序。我需要执行gdk\u pixbuf\u get\u from\u drawable,现在这个函数需要在主线程上运行 我读了这篇文章: 并且学会了从我的线程中调用这个,我必须首先调用: g_threads\u init()-我不这样做,因为我在libgdk-x11-2.0.so.0或libgtk-x11-2.0.so.0中找不到定义的函数 gdk\u threads\u init() gtk_init(0,null) gdk\
gdk\u pixbuf\u get\u from\u drawable
,现在这个函数需要在主线程上运行
我读了这篇文章:
并且学会了从我的线程中调用这个,我必须首先调用:
g_threads\u init()
-我不这样做,因为我在libgdk-x11-2.0.so.0
或libgtk-x11-2.0.so.0中找不到定义的函数
gdk\u threads\u init()
gtk_init(0,null)
gdk\u threads\u enter()
gdk_pixbuf_get_from_drawinable(..)
gdk\u threads\u leave()
gdk\u threads\u init
安全吗?线程从未被破坏,所以我不应该正确运行它?但我这样做安全吗gtk_init(0,null)
吗你不应该需要这些;Firefox将为您完成gtk_init,如果您在主线程上,则不需要任何线程内容。如果FF确实使用GDK线程,那么您最需要的就是进入和离开
SEG故障很可能是由无关错误引起的。尝试设置MALLOC\u CHECK\u2并在gdb中运行,或者尝试在valgrind下运行,以查找内存错误。我在帮他解决问题,我认为Firefox在任何地方都不会
gdk\u threads\u init
如果没有这样做,我可以告诉他在他的函数中多次这样做吗?因为我帮助了很多插件开发人员,他们都可能会调用gdk\u threads\u init
,用户可能会安装一个或多个插件。因此,gdk\u threads\u init
将被多次调用。或者我应该告诉他们每个线程调用一次gdk\u threads\u init
?所有这些C函数都是从Firefox插件中的WebWorker线程调用的。或者我应该在调用gtk_init
之前提交一个bug并请求Firefox插件gdk_init
?正如文档所说,gdk_threads_init
应该放在gtk_init
之前,如果它放在后面会不会很糟糕?在最新的gtk中,这些线程函数已经被弃用了,你应该在主线程上做所有事情,这可能一直是最好的。如果FF不调用threads init或使用enter/leave本身,那么在FF中就必须这样做;添加init是不够的。所以我认为你需要把截图代码放到主线程上。这通常是通过添加一个空闲函数来完成的(g_idle_add)。我相信您可以从其他线程添加g_idle_add,然后空闲函数在主线程上运行。如果没有,那么您可能需要使用idle_add的变体,它接受主上下文,并从主线程手动传入上下文。但我认为这就是g_idle_add的作用。如果不调试它,我就不知道了。不过,我认为Firefox有一种方法可以将任务从另一个线程发送到主线程。