【问题标题】:Assertion fails in g_application_parse_command_line whenever gtk application run multiple times每当 gtk 应用程序运行多次时,g_application_parse_command_line 中的断言就会失败
【发布时间】:2020-01-09 04:25:29
【问题描述】:

如果我想多次运行一个 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)

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

【问题讨论】:

  • 你的Some(fallback_message.unwrap_or("Hello world"))可以写成:fallback_message.or(Some("Hello world"))
  • 这可能应该在 gtk-rs 中作为一个问题提出——你永远不能在安全的 Rust 代码中导致段错误。诚然,这条线有点模糊,因为它发生在外部库中,但仍然如此!

标签: rust gtk-rs


【解决方案1】:

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

GTK 的对象树以Application 开头,您的情况就是这样。然后它有 1 个或多个 ApplicationWindows,它们本身就是“窗口”。从那里开始,您的所有组件都在此之下。

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

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

【讨论】:

  • 另外,from the doc很像glib::MainLoop::run,此函数将在应用程序运行期间获取主上下文。 这只能完成一次。
猜你喜欢
  • 2014-07-12
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多