【发布时间】:2021-12-04 11:08:45
【问题描述】:
我正在开发一个应用程序,该应用程序可选使用 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 库需要在启动时将 Fn 回调传递给 application.connect_activate,因此我不能使用 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,我希望避免使用 GTK 和回调,如果 GUI 是未使用。有什么方法可以安全地在闭包中移动window_rx,或者在回调中取消引用它而不会导致错误?
【问题讨论】:
标签: rust rust-gnome