4

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

4

1 回答 1

1

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

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

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

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

于 2012-09-11T22:10:51.583 回答