c - GTK+ gtk_widget_show_all() 在 fork 和 exec() 之后需要很长时间

标签 c fonts gtk exec fork

我正在为 Linux 开发一个 GTK+ 应用程序,它使用 fork() 从另一个 GTK+ 应用程序启动,然后使用 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 秒内加载。所以它与字体处理有关。

最佳答案

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

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

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

有关您想要了解的更多详细信息,您可以查看 g_spawn_*() 函数的源代码。

关于c - GTK+ gtk_widget_show_all() 在 fork 和 exec() 之后需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12357103/

相关文章:

c - Postfix运算符的优先级确实比前缀高吗?

mono - 如何在 GTK+/GTK 中切换全屏模式#

c# - 如何在迭代时将 ListItem 添加到列表中 (C#)?

java - 创建全局文件输入

iphone - 如何实现这种字体外观?

css - 如何使用 webpack 将字体加载到我的元素中?

gtk - GtkTreeViews 上的列大小

c - 如何在 C 中正确实现健壮的堆栈

c - 与执行无关的回溯地址

c - 对函数进行字节编码时出现段错误?