为什么使用 `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
我正在尝试学习 GTK3,但文档充其量是有问题的。最令人沮丧的问题来自使用 g_application_run
。当程序为 运行.
示例如下:
#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