2017-07-25 28 views
0

我正在爲Rust編寫一個Phoenix客戶端庫,利用來自rust-websockets的異步websocket客戶端。現在我無法確定如何將回調函數傳遞到處理WebSocket流量的線程中。我有一個簡單的結構:從另一個線程調用FnMut回調

pub struct Socket { 
    endpoint:    String, 
    connected:    Arc<AtomicBool>, 
    state_change_close:  Option<Box<FnMut(String)>>, 
} 

這個結構有一個connect功能佈局如下:

pub fn connect(&mut self) -> Result<(), String> { 
    if self.connected.load(Ordering::Relaxed) { 
     return Ok(()) 
    } 

    // Copy endpoint string, otherwise we get an error on thread::spawn 
    let connection_string = self.endpoint.clone(); 
    let (usr_msg, stdin_ch) = mpsc::channel(0); 

    let connection_thread = thread::spawn(move || { 
     // tokio core for running event loop 
     let mut core = Core::new().unwrap(); 
     let runner = ClientBuilder::new(&connection_string) 
      .unwrap() 
      .add_protocol("rust-websocket") 
      .async_connect_insecure(&core.handle()) 
      .and_then(|(duplex, _)| { 
       let (sink, stream) = duplex.split(); 
       stream.filter_map(|message| { 
        println!("Received Message: {:?}", message); 
        match message { 
         OwnedMessage::Close(e) => { 
          // This is the line where I am trying to call the callback 
          if let Some(ref mut func) = self.state_change_close { 
           (func)(e.unwrap().reason); 
          } 
          Some(OwnedMessage::Close(e)) 
         }, 
         _ => None, 
        } 
       }) 
       .select(stdin_ch.map_err(|_| WebSocketError::NoDataAvailable)) 
       .forward(sink) 
      }); 

     // Start the event loop 
     core.run(runner).unwrap(); 
    }); 
    self.connected.store(true, Ordering::Relaxed); 
    return Ok(()) 
} 

當我嘗試編譯此代碼我收到以下錯誤:

error[E0277]: the trait bound `std::ops::FnMut(std::string::String) + 'static: std::marker::Send` is not satisfied 
    --> src\socket.rs:99:29 
    | 
99 |  let connection_thread = thread::spawn(move || { 
    |        ^^^^^^^^^^^^^ the trait `std::marker::Send` is not implemented for `std::ops::FnMut(std::string::String) + 'static` 
    | 

我曾嘗試將state_change_close的類型更改爲Mutex<Option<...>>以避免線程安全問題,但這對此問題沒有幫助。我正在嘗試做什麼?

回答

1

在做了一些更多的研究之後,我意識到我只需要修改Option<Box<FnMut(String)>>Option<Box<FnMut(String) + Send>>並將我的代碼複製到可以設置回調的位置。更多瞭解特質對象!

相關問題