Ü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.