Übergeben Sie den verwalteten Funktionszeiger als nicht verwalteten Rückruf

Ich versuche, einen verwalteten Funktionszeiger zu übergebenvoid (*)(void *) zu meiner nicht verwalteten Bibliothek. Meine nicht verwaltete Bibliothek ruft diesen Rückruf mit einem Zeiger auf einen durch einen CriticalSection geschützten Datenrahmen auf. Während der verwaltete Rückruf ausgeführt wird, kann nichts anderes den Datenrahmen aufgrund des kritischen Abschnitts ändern. Ich erhalte jedoch Zugriffsverletzungen und Heap-Beschädigungen, wenn ich nur den Rückruf eingebe.

BEARBEITEN: Ich vergaß zu erwähnen. DasStartStreaming() stiehlt den Thread, den es verwaltet. Darüber hinaus wird ein separater Thread zum Versenden neuer Daten an den angegebenen Rückruf erstellt. Der Rückruf wird in diesem separaten Thread aufgerufen.

Bisher habe ich folgendes gemacht:

//Start Streaming
streaming_thread_ = gcnew Thread(gcnew ThreadStart(&Form1::WorkerThreadFunc));
streaming_thread_->Start();

Woher:

extern "C" {
#include "libavcodec\avcodec.h"
#include "libavutil\avutil.h"
}

namespace TEST_OCU {

delegate void myCallbackDelegate(void * usr_data); //Declare a delegate for my unmanaged code

public ref class Form1 : public System::Windows::Forms::Form
{
    public:

    static void WorkerThreadFunc()
    {
        myCallbackDelegate^ del = gcnew myCallbackDelegate(&Form1::frame_callback);

        MessageBox::Show("Starting to Streaming", "Streaming Info");
        if(rtsp_connection_ != NULL)
            rtsp_connection_->StartStreaming();
            //rtsp_connection_->StartStreaming((void (*)(void *)) System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(del).ToPointer() );
        MessageBox::Show("Done Streaming", "Streaming Info");
    }

    static void __cdecl frame_callback(void * frame)
    {
        AVFrame * casted_frame = (AVFrame *)frame;
    }

private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) 
    {
        if(rtsp_connection_ == NULL)
            rtsp_connection_ = new NeyaSystems::RTSPConnection("rtsp://url");
    }

    private: static RTSPConnection * rtsp_connection_ = NULL;
}
}
Ich habe viel sinnlosen Code weggelassen ...StartStreaming Der Standardwert ist ein NULL-Zeiger. In diesem Fall tritt keine Beschädigung aufStartStreaming mit dem delegierten Funktionszeiger verursacht Heap-BeschädigungRTSPConnection ist in nativem C ++ implementiert und enthält auch C-Aufrufe (libavcodec)RTSPConnection enthält zwei Threads, Kommunikations- und Frame-Dispatch-Thread (ruft den verwalteten Rückruf auf)

Könnte mir jemand einen Semmelbrösel geben? Vielen Dank im Voraus.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage