在 C# 中安全地回显 MIDI 数据

Posted

技术标签:

【中文标题】在 C# 中安全地回显 MIDI 数据【英文标题】:Safely echoing MIDI data in C# 【发布时间】:2009-09-21 12:21:34 【问题描述】:

作为一个附带项目,我正在实现一个 MIDI 矩阵,以将多个 MIDI 键盘与声源互连。这里的关键要求是将输入端口上接收到的 MIDI 数据回显到选定的输出端口。 创建了必要的 P/Invoke 声明和包装器后,我注意到 MidiInProc 的 Win32 MIDI 文档指出:“应用程序不应从回调函数内部调用任何多媒体函数,因为这样做会导致死锁”. 鉴于从MidiInProc 中调用midiOutShortMsg 是不安全的,我当前的解决方案是将MIDI 数据写入队列并设置事件。工作线程等待事件并调用midiOutShortMsg。大致思路是这样的:-

static void InputCallback( int hMidiIn, uint wMsg, uint dwInstance, uint dwParam1, uint dwParam2 )

    if( wMsg == MM_MIM_DATA )
    
        data.EnQueue( dwParam1 );       //data is a Queue<uint>
        dataReady.Set();            //dataReady is AutoResetEvent
    



void ThreadProc

    while( !_done )
    
        dataReady.WaitOne();
        midiOutShortMsg( hMidiOut, data.DeQueue() );
    

然而,虽然这在测试中运行良好,但在调用 dataReady.Set()InputCallBack 返回之间似乎存在一个机会窗口,在此期间抢占可以允许工作线程调用 midiOutShortMsg(尽管在另一个线程)。 这种方法安全吗?

【问题讨论】:

【参考方案1】:

对我来说看起来很安全:即使你的两个线程同时运行,它仍然只有工作线程可能会阻塞,所以这不会死锁你的输入回调。

【讨论】:

我同意这一点。只有当线程等待自己完成时才会发生死锁 - 因为它正在等待,所以它不能。在这种情况下,线程正在等待另一个线程。【参考方案2】:

对于 ***,您的问题可能有点特定于域。如果这里没有人回答,请查看:http://groups.google.com/group/mididev?hl=en&lnk=

【讨论】:

谢谢。看起来很有用。 只是不要告诉他们是我派给你的。我倾向于一有机会就诋毁 MIDI(我在 MIDI 应用程序上花了数年时间,所以我觉得我有资格)。 :)

以上是关于在 C# 中安全地回显 MIDI 数据的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中将 MIDI 消息发送到 DAW

前端使用富文本编辑器输入内容回显到页面带格式

在while循环中动态回显字符串[重复]

动态生成 PayPal 按钮

Wordpress term_exist 没有回显任何东西?

使用 PDO 插入带有特殊字符的值