Pass Managed Function Pointer jako Unmanaged Callback

Próbuję przekazać wskaźnik funkcji zarządzanejvoid (*)(void *) do mojej niezarządzanej biblioteki. Moja niezarządzana biblioteka wywołuje to wywołanie zwrotne za pomocą wskaźnika do ramki danych chronionych przez CriticalSection. Gdy uruchomione jest wywołanie zwrotne zarządzane, nic innego nie może zmodyfikować ramki danych z powodu sekcji krytycznej. Jednak dostaję naruszenia dostępu i uszkodzenia stosu po prostu wprowadzając wywołanie zwrotne.

EDYTOWAĆ: Zapomniałem wspomnieć. TheStartStreaming() kradnie wątek, którym zarządza. Ponadto tworzy oddzielny wątek do wysyłania nowych danych do danego wywołania zwrotnego. Wywołanie zwrotne jest wywoływane w tym osobnym wątku.

Do tej pory wykonałem następujące czynności:

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

Gdzie:

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;
}
}
Pominąłem wiele bezsensownego kodu ...StartStreaming domyślnie jest to wskaźnik NULL, w tym przypadku nie dochodzi do uszkodzeniaStartStreaming z delegowanym wskaźnikiem funkcji powoduje uszkodzenie stertyRTSPConnection jest zaimplementowany w natywnym C ++ i zawiera również wywołania C (libavcodec)RTSPConnection zawiera dwa wątki, komunikację i wątek wysyłania ramek (wywołuje wywołanie zwrotne)

Czy ktoś może dać mi bułkę tartą? Z góry bardzo dziękuję.

questionAnswers(2)

yourAnswerToTheQuestion