Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Gtk2多线程gdk_pixbuf_从可绘制问题获取__C_Multithreading_Gtk_Gdk - Fatal编程技术网

C Gtk2多线程gdk_pixbuf_从可绘制问题获取_

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\

嗨,哥们

我正在为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\u threads\u enter()
  • gdk_pixbuf_get_from_drawinable(..)
  • gdk\u threads\u leave()
  • 所以这很好,但每次我的用户点击按钮拍摄屏幕时,我都会再次执行所有这些功能。因此,我的问题是:

  • 多次运行
    gdk\u threads\u init
    安全吗?线程从未被破坏,所以我不应该正确运行它?但我这样做安全吗
  • 可以多次运行
    gtk_init(0,null)
  • 我问这个问题的原因是,当我通过重复调用函数进行测试时,通常在第二次之后,应用程序速度会减慢,最终会崩溃,并显示以下消息:

    程序接收信号SIGSEGV,分段故障

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


    你不应该需要这些;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有一种方法可以将任务从另一个线程发送到主线程。