gpt4 book ai didi

rust - 每当 gtk 应用程序多次运行时,g_application_parse_command_line 中的断言失败

转载 作者:行者123 更新时间:2023-11-29 08:26:10 26 4
gpt4 key购买 nike

如果我想多次运行一个 gtk 应用程序,我的 Gtk-rs 程序就会崩溃。

use gio::prelude::*;
use gtk::prelude::*;

static APP_ID: &'static str = "com.localserver.app";

fn build_ui(app: &gtk::Application, fallback_message: Option<&'static str>) {
{
let window = gtk::ApplicationWindow::new(app);
window.set_title("App");
window.set_position(gtk::WindowPosition::Center);
window.set_default_size(350, 70);

window.add(&gtk::Label::new(Some(
fallback_message.unwrap_or("Hello world"),
)));

window
}
.show_all();
}

fn main() {
let args = std::env::args().collect::<Vec<_>>();
let application: gtk::Application =
gtk::Application::new(Some(APP_ID), Default::default()).unwrap();
application.connect_activate(|app| build_ui(&app, None));

for n in 1 .. 4 {
application.run(&args);
println!("Window loaded {} times.", n);
}
}

运行时,它会在最后的 for 循环中进行第一次迭代,但下次会崩溃:

(dbustest_rs:9805): GLib-GIO-CRITICAL **: 19:23:51.883: g_application_parse_command_line: assertion '!application->priv->options_parsed' failed
Segmentation fault (core dumped)

是什么原因造成的,我该如何预防?

最佳答案

这个问题是对 GTK 中发生的事情和对象层次结构的简单误解。

GTK 的对象树以一个 Application 开始,在您的案例中就是这样。然后它有 1 个或多个 ApplicationWindow,它们本身就是“窗口”。从那里开始,您的所有组件都在其下。

您已正确完成此层次结构 - 您在 Application 下创建了您的 ApplicationWindow,正如您应该的那样。但是,您随后决定 run() 此应用程序四次,并且在库内部进行检查以查看参数之前是否已被解析。因为它是同一个(回收的)应用程序,所以它们是错误的。

考虑每次都重新创建Application;它也遵循自然的 GTK 生命周期。

关于rust - 每当 gtk 应用程序多次运行时,g_application_parse_command_line 中的断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57819514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com