我正在开发一个应用程序,该应用程序可以选择使用 GUI 来显示大致如下结构的视频数据:
fn main() {
let (window_tx, window_rx) =
MainContext::channel::<MyStruct>(PRIORITY_DEFAULT);
let some_thread = thread::spawn(move || -> () {
// send data to window_tx
});
let application =
gtk::Application::new(Some("com.my.app"), Default::default());
application.connect_activate(move |app: >k::Application| {
build_ui(app, window_rx);
});
application.run();
some_thread.join().unwrap();
}
fn build_ui(application: >k::Application, window_rx: Receiver<MyStruct>) {
window_rx.attach( ... );
}
gtk rust 库需要application.connect_activate
在启动时传递一个 Fn 回调,所以我不能使用 FnOnce 或 FnMut 闭包来移动回调中的 glib::Receiver。编译器抛出此错误:
error[E0507]: cannot move out of `window_rx`, a captured variable in an `Fn` closure
我试图通过包装window_rx
在 Rc 中来避免移动,即:
let r = Rc::new(RefCell::new(window_rx));
application.connect_activate(move |app: >k::Application| {
build_ui(app, Rc::clone(&r));
});
但是在我的build_ui
函数中取消引用 Rc 时,我得到了这个错误:
error[E0507]: cannot move out of an `Rc`
到目前为止,我使用的后备方法是将通道创建和线程创建移到我的build_ui
函数中,但由于不需要 GUI,如果不使用 GUI,我希望完全避免使用 GTK 和回调。有什么方法可以安全地window_rx
在闭包内移动,或者在回调中取消引用它而不会导致错误?