-1

我用 C++/CLI 编写了一个库,以便更轻松地从托管代码访问 MIDI 功能。库有一个托管类,其中包含一个提供委托作为事件处理程序的类,并由 midiInOpen 函数的“本机”回调方法调用。

void MidiInDevice::MidiInProcNative(HMIDIIN midiInDevice, UINT msg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
    if(MidiInProcedure == nullptr)
        return;

    MidiMessage^ message;
    switch(msg)
    {
    case MIM_DATA:
        {
            message = gcnew MidiMessage(dwParam1, dwParam2);
            break;
        }
    }

    MidiInProcedure(this, message);
}

现在我已将此方法添加到委托中,该委托是加载 c++/cli 库的 C# 应用程序的一部分:

    public void MidiInProc(SharpMidi.MidiInDevice midiInDevice, SharpMidi.MidiMessage message)
    {
        tbMidiInMessages.AppendText(String.Format("\n{0}: {1:X}", message.TimestampString, message.Message));

    }

但是,我在调用时收到 InvalidOperationException (Cross-Thread Operation Invalid) AppendText

在谷歌搜索这个问题时,我被明显的 Windows 窗体异常情况淹没了,这在某种程度上并没有真正帮助我,因为我的 MidiMessage 类不提供任何调用功能。

那么我有什么选择来解决这个问题呢?

问候, 赛瑟

4

1 回答 1

1

您的问题与 Windows 窗体完全相关。使用Invoke您的System.Windows.Forms.Textbox对象 ( tbMidiInMessage) 或System.Windows.Forms.Form拥有它的方法(您this在 C# UI 代码中的对象)。

于 2013-11-14T17:57:28.000 回答