我正在尝试学习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
将有助于确定这是什么。当我们知道这一点时,我们可以找出如何修复它。