我正在开发一个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()
花费的时间?
fc-cache -f
在嵌入式设备上为Fontconfig
系统创建字体缓存,则secondary_gtk_app会在大约2秒内加载。所以它与字体处理有关。
答案 0 :(得分:1)
一般来说,不建议将Gtk应用程序用于fork()
,而是使用g_spawn_*
函数系列。
当然,如果你真的想要或需要,你可以调用fork()
,但是你必须至少注意一个重点:关闭所有文件描述符,然后调用exec*()
。如果你没有这样做,子进程将继承许多(所有)父fds。
请注意,图形应用程序至少有一个fd将其连接到X11服务器。甚至更多......
有关您希望了解的更多详细信息,您可以查看g_spawn_*()
函数的来源。