c-GTK+GTK_widget_show_all()在fork和exec()之后花费了很长时间



我正在为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_*()函数的来源。

相关内容

最新更新