为什么使用 `g_application_run` 会产生约 25 秒的延迟?

Why does using `g_application_run` create a lag of ~25 seconds?

我正在尝试学习 GTK3,但文档充其量是有问题的。最令人沮丧的问题来自使用 g_application_run。当程序为 运行.

时,它似乎会产生约 25 秒的延迟

示例如下:

#include <gtk/gtk.h>

static void activate(GtkApplication *app, gpointer user_data)
{
    GtkWidget *window;

    window = gtk_application_window_new(app);
    gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
    gtk_widget_show_all(window);

exit(0);
}

int main(int argc, char **argv)
{
    GtkApplication *app;

    app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    g_application_run(G_APPLICATION(app), argc, argv);
    g_object_unref(app);

    return 0;
}

非常小,它创建一个 window,显示它并退出。基本上测试加载时间。当 运行 与 time 我得到以下结果:

$ time ./capplication_new 

real    0m25.177s
user    0m0.151s
sys     0m0.014s

程序到 运行 超过 25 秒。这实在是让人无法接受。最令人沮丧的是,它是您应该开始使用的最新代码。但是,如果我 运行 这个创建 window 的最小示例,显示它并退出:

#include <gtk/gtk.h>

int main (int argc, char *argv[])
{
    gtk_init(&argc, &argv);

    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_widget_show(window);

exit(0);

    gtk_main();
}

当运行与time时,结果为:

$ time ./binit 

real    0m0.139s
user    0m0.108s
sys     0m0.023s

有什么方法可以阻止它滞后吗?为什么会滞后?如果它滞后,为什么这是新代码?

**编辑:

$ uname -a
Linux testing 5.10.0-11-amd64 #1 SMP Debian 5.10.92-1 (2022-01-18) x86_64 GNU/Linux

要找出它在您的机器上而不是在其他人的机器上滞后的原因,您需要进行更多调试。我建议从 ltrace 开始(您可能需要安装)。你可以 运行:

ltrace -t -f -e '@*' ./capplication_new

这应该会向您显示在您的应用程序中进行的所有库调用,并帮助突出显示导致延迟的调用。

从您的计时我们可以看出,您的应用几乎在 25 秒的所有时间里都在等待其他事情。希望 ltrace 将有助于确定那是什么。当我们知道这一点时,我们可以找出解决方法。

我没有找到发生这种情况的原因,但我找到了解决方案。

您需要将以下内容添加到您的 .xinitrc.xsession 文件中:

dbus-update-activation-environment --systemd DBUS_SESSION_BUS_ADDRESS DISPLAY XAUTHORITY