我正在为Linux开发一个GTK+
应用程序,该应用程序是从另一个使用fork()
然后使用execvp()
的GTK+
应用程序启动的。
我注意到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+进行一些字体初始化有关。如果我提前在嵌入式设备上运行为Fontconfig
系统创建字体缓存的fc-cache -f
,那么secondary_gtk_app将在大约2秒内加载。所以它与字体处理有关。
一般来说,Gtk应用程序不建议使用fork()
,而是使用g_spawn_*
函数族。
当然,如果您真的想要或需要,您可以调用fork()
,但您必须至少注意一点:在调用exec*()
之前关闭所有文件描述符。如果未能做到这一点,子进程将继承许多(全部)父fds。
请注意,图形应用程序至少有一个fd将其连接到X11服务器。也许更。。。
要了解更多详细信息,可以查看g_spawn_*()
函数的来源。