我已经用C ++ / CLI编写了一个库,以便更容易地从托管代码访问MIDI功能。该库有一个托管类,它包含一个类,该类提供委托作为事件处理程序,并由midiInOpen函数的“本机”Callback方法调用。
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));
}
但是我在AppendText
电话上收到InvalidOperationException(跨线程操作无效)。
当谷歌搜索问题时,我被淹没了异常的明显的窗体形式案例,由于我的MidiMessage类没有提供任何调用功能,因此不知何故这对我没有帮助。
那么我有什么方法可以解决这个问题呢?
此致 Xaser
答案 0 :(得分:1)
您的问题与Windows窗体完全相关。使用Invoke
对象(System.Windows.Forms.Textbox
)的tbMidiInMessage
方法,或拥有它的System.Windows.Forms.Form
(C#用户界面代码中的this
对象)。< / p>