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

时间:2012-09-10 18:02:55

标签: c fonts gtk exec fork

我正在开发一个GTK+ Linux应用程序,它使用GTK+然后fork()从另一个execvp()应用程序启动。

我注意到exec()'d应用程序需要大约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秒内加载。所以它与字体处理有关。

1 个答案:

答案 0 :(得分:1)

一般来说,不建议将Gtk应用程序用于fork(),而是使用g_spawn_*函数系列。

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

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

有关您希望了解的更多详细信息,您可以查看g_spawn_*()函数的来源。