我正在为 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/