【问题标题】:GTK+ gtk_widget_show_all() taking a long time after fork and exec()GTK+ gtk_widget_show_all() 在 fork 和 exec() 之后需要很长时间
【发布时间】:2012-09-10 18:02:54
【问题描述】:

我正在为 Linux 开发一个 GTK+ 应用程序,该应用程序是从另一个 GTK+ 应用程序使用 fork()execvp() 启动的。

我注意到 exec() 的应用程序需要大约 10-15 秒才能完成对 gtk_widget_show_all() 的调用。这段时间后,小部件和窗口出现,应用程序运行完美。

所以应用程序的调用如下所示:

main_gtk_app -> fork() -> execvp(secondary_gtk_app)。 secondary_gtk_app 需要很长时间才能显示窗口和小部件。

但是,如果我直接运行应用程序,而不是从 GTK+ 应用程序执行 exec(),那么从命令行调用 gtk_widget_show_all() 不会有延迟。

调用:

shell命令行:./secondary_gtk_app(从命令行开始,显示窗口和小部件没有延迟)。

有人知道导致这种行为的原因吗?或者可以减少在gtk_widget_show_all() 中花费的时间长度的方法?

编辑:经过一些研究,似乎大部分延迟与 GTK+ 进行一些字体初始化有关。如果我运行fc-cache -f,它会预先在嵌入式设备上为Fontconfig 系统创建字体缓存,那么secondary_gtk_app 会在大约2 秒内加载。所以它与字体处理有关。

【问题讨论】:

    标签: c fonts gtk exec fork


    【解决方案1】:

    一般来说,Gtk 应用不建议做fork(),而是使用g_spawn_* 函数族。

    当然,如果你真的想要或需要,你可以调用fork(),但你至少要注意一个重要的点:在调用exec*()之前关闭所有文件描述符。如果不这样做,子进程将继承许多(全部)父 fd。

    请注意,图形应用程序至少有一个 fd 将其连接到 X11 服务器。甚至更多……

    有关您想知道的更多详细信息,您可以查看g_spawn_*() 函数的来源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 2011-05-15
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多