DAW 实现中线程间消息传递的类型系统

问题描述 投票:0回答:0

我正在用 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
枚举推断或检查正确的输出类型?或者我应该完全使用不同的方法?

rust types
© www.soinside.com 2019 - 2024. All rights reserved.