4

を使用しGTK+て別のGTK+アプリケーションから起動される Linux 用のアプリケーションを開発しています。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()呼び出しに遅延はありません。

呼び出し:

シェル コマンド ライン: ./secondary_gtk_app (コマンド ラインから開始し、ウィンドウとウィジェットの表示に遅延はありません)。

この動作の原因を知っている人はいますか? または、おそらくに費やされる時間を短縮する方法はありgtk_widget_show_all()ますか?

編集: いくつかの調査の結果、遅延の大部分は GTK+ によるフォントの初期化に関係しているようです。事前に組み込みデバイスでシステムfc-cache -fのフォント キャッシュを作成するコマンドを実行すると、secondary_gtk_app が約 2 秒で読み込まれます。Fontconfigというわけで、フォントの扱いに関係しています。

4

1 に答える 1

1

一般的に言えば、Gtk アプリケーションでの実行は推奨されませんが、代わりに関数ファミリをfork()使用してください。g_spawn_*

もちろん、fork()本当に必要な場合は を呼び出すことができますが、少なくとも 1 つの重要な点に注意する必要があります: を呼び出す前に、すべてのファイル記述子を閉じますexec*()。これを行わないと、子プロセスは親 fd の多く (すべて) を継承します。

グラフィカル アプリケーションには、X11 サーバーに接続する少なくとも 1 つの fd があることに注意してください。そして多分もっと...

知りたいと思う詳細については、g_spawn_*()関数のソースを参照してください。

于 2012-09-11T22:10:51.583 に答える