0

私は Gtk-rs アプリケーションを書いています。MPSC チャネルを介してメインの Gtk スレッドにイベントを送信するバックグラウンド スレッドがあります。このバックグラウンド スレッド内で回復不能なエラーが発生した場合はどうすればよいですか?

私はそれらを処理したくありません (パニックに! またはパニックにならない! )。

現在、スレッドはパニックになりますが、メイン アプリケーションは停止しません。アプリケーション全体がエラーでクラッシュすることを望みます。

let (sender, receiver) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);

// Spawn the thread and move the sender in there
thread::spawn(move || {
    loop {
        let msg = do_work().unwrap();
        sender.send(msg).unwrap();
    }
});
receiver.attach(None, move |msg| {
    ...
    glib::Continue(true)
});
  • 呼び出された関数のパニックでは機能しないため、チャネルを介して Result を送信したくありません。
  • スレッドに参加すれば問題は解決しますが、Gtk-rs ではブロックされているのでできないと思います。

この質問は、スレッドでパニックを発生させてメインスレッドをすぐに終了させるにはどうすればよいですか? に似ています。、しかし、Gtk-rsのより良い解決策があるのだろうか.

4

1 に答える 1

0

パニックハンドラーを変更するとset_hook、問題が解決します。

fn change_panic_behaviour() {                
    let hook = std::panic::take_hook();
    std::panic::set_hook(Box::new(move |error| {
        hook(error);
        std::process::exit(1);
    }));
}
于 2020-02-12T17:45:36.457 に答える