我正在用 Rust 实现自己的 DAW,当涉及到线程间的消息传递时,我在类型系统方面遇到了一些麻烦。具体来说,我有一个线程负责从 UI 接收消息并将它们传递给引擎,另一个线程负责运行引擎和处理消息。线程 1 将发送一条消息,然后等待线程 2 查看并处理它,并且可能取决于消息发回
OutputType
.
对于创建的每个
BusTrack
都会有一个 MailMan 和一个 MailReceiver
,其中 ui 可以在线程 1 中的 send_and_await_recv()
上调用 MailMan
,然后在线程 2 中的每个 BusTrack
中,MailReceiver
将检查是否有任何新消息或以其他方式继续创建和处理音频。
我试图让 Rust 编译器根据我定义的
BusTrackMessage
枚举推断或检查线程之间传递的消息的正确输出类型。我还定义了一个 OutputType
枚举来表示引擎可以返回的可能类型的值。
这是我目前正在使用的代码的简化版本:
pub enum BusTrackMessage {
SetMidiTrack((MidiTrack, [type = Empty])),
AdjustRelease((f64, [type = Empty])),
GetRelease(((), [type = Value(f64)])),
AdjustVolume((f64, [type = Empty])),
GetVolume((Empty, [type = f64])),
}
pub enum OutputType {
Value(f64),
Empty,
}
pub struct MessageHolder {
sender_back: Sender<OutputType>,
message: BusTrackMessage,
}
impl MessageHolder {
pub fn new(message: BusTrackMessage, sender_back: Sender<OutputType>) -> MessageHolder {
MessageHolder {
sender_back,
message,
}
}
}
pub struct MailMan {
sender: Sender<MessageHolder>,
}
impl MailMan {
pub fn new() -> Self {
let (sender, _receiver) = mpsc::channel();
MailMan { sender }
}
pub fn send_and_await_recv(&self, message: BusTrackMessage) -> <[outputtype based on message?]>
{
let (send_back, receiver_back) = mpsc::channel();
let message_holder = MessageHolder::new(message, send_back);
self.sender.send(message_holder).unwrap();
receiver_back.recv().unwrap()
}
}
如您所见,我目前正在使用 mpsc crate 中的
Sender
和 Receiver
在线程之间传递消息。但是,我不确定如何定义正确的返回输出类型并为 send_and_await_recv
设置通道类型
MailMan
结构中的函数,基于传入的 BusTrackMessage
。
有没有办法让 Rust 编译器根据
BusTrackMessage
枚举推断或检查正确的输出类型?或者我应该完全使用不同的方法?