1 use error::Result; 2 use std::sync::mpsc::{self, Sender}; 3 use std::thread; 4 use super::{RowData, Worker}; 5 use super::immediate::ImmediateWorker; 6 7 enum WorkerMsg { 8 Start(RowData), 9 AppendRow((usize, Vec<i16>)), 10 GetResult((usize, Sender<Vec<u8>>)), 11 } 12 13 pub struct ThreadedWorker { 14 sender: Sender<WorkerMsg>, 15 } 16 17 impl Worker for ThreadedWorker { new() -> Result<Self>18 fn new() -> Result<Self> { 19 let thread_builder = thread::Builder::new().name("worker thread".to_owned()); 20 let (tx, rx) = mpsc::channel(); 21 22 thread_builder.spawn(move || { 23 let mut worker = ImmediateWorker::new_immediate(); 24 25 while let Ok(message) = rx.recv() { 26 match message { 27 WorkerMsg::Start(data) => { 28 worker.start_immediate(data); 29 }, 30 WorkerMsg::AppendRow(row) => { 31 worker.append_row_immediate(row); 32 }, 33 WorkerMsg::GetResult((index, chan)) => { 34 let _ = chan.send(worker.get_result_immediate(index)); 35 }, 36 } 37 } 38 })?; 39 40 Ok(ThreadedWorker { sender: tx }) 41 } start(&mut self, row_data: RowData) -> Result<()>42 fn start(&mut self, row_data: RowData) -> Result<()> { 43 Ok(self.sender.send(WorkerMsg::Start(row_data))?) 44 } append_row(&mut self, row: (usize, Vec<i16>)) -> Result<()>45 fn append_row(&mut self, row: (usize, Vec<i16>)) -> Result<()> { 46 Ok(self.sender.send(WorkerMsg::AppendRow(row))?) 47 } get_result(&mut self, index: usize) -> Result<Vec<u8>>48 fn get_result(&mut self, index: usize) -> Result<Vec<u8>> { 49 let (tx, rx) = mpsc::channel(); 50 self.sender.send(WorkerMsg::GetResult((index, tx)))?; 51 Ok(rx.recv()?) 52 } 53 } 54