c-为什么使用"g_application_run"会产生约25秒的延迟



我正在尝试学习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;
}

非常简单,它创建一个窗口,显示它并退出。基本上是测试加载时间。当使用time运行时,我得到以下结果:

$ time ./capplication_new 
real    0m25.177s
user    0m0.151s
sys     0m0.014s

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

#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

我不知道为什么会发生这种情况,但我找到了解决方案。

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

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

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

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

这将显示应用程序中进行的所有库调用,并有助于突出显示导致延迟的调用。

从你的时间安排中,我们可以看到你的应用程序在25秒内几乎都在等待其他事情。希望ltrace将有助于确定这是什么。当我们知道这一点时,我们可以找出如何修复它。

最新更新