-1

マネージド コードから MIDI 機能に簡単にアクセスできるように、C++/CLI でライブラリを作成しました。ライブラリには、イベント ハンドラーとしてデリゲートを提供するクラスを含むマネージ クラスがあり、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 (クロススレッド操作が無効) が発生しAppendTextます。

問題をグーグルで検索すると、例外の明らかなWindowsフォームのケースが殺到しました。これは、MidiMessageクラスが呼び出し機能を提供していないため、実際には役に立ちません。

では、この問題を解決するためのオプションは何ですか?

よろしく、 Xaser

4

1 に答える 1

1

あなたの問題は完全に Windows フォームに関連しています。オブジェクトのInvokeメソッド( )、またはそれを所有する を使用します ( C# UI コードのオブジェクト)。System.Windows.Forms.TextboxtbMidiInMessageSystem.Windows.Forms.Formthis

于 2013-11-14T17:57:28.000 に答える