void (*)(void *)
管理対象関数ポインタを管理対象外ライブラリに渡そうとしています。私のアンマネージライブラリは、CriticalSectionによって保護されているデータのフレームへのポインターを使用してこのコールバックを呼び出します。マネージドコールバックの実行中は、クリティカルセクションが原因でデータのフレームを変更できるものは他にありません。ただし、コールバックを入力するだけでアクセス違反とヒープ破損が発生します。
編集:私は言及するのを忘れました。StartStreaming()
管理しているスレッドを盗みます。さらに、指定されたコールバックに新しいデータをディスパッチするための別のスレッドを作成します。コールバックは、この別のスレッドで呼び出されます。
これまでのところ、私は次のことを行いました。
//Start Streaming
streaming_thread_ = gcnew Thread(gcnew ThreadStart(&Form1::WorkerThreadFunc));
streaming_thread_->Start();
どこ:
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;
}
}
- 無意味なコードをたくさん省略しました...
StartStreaming
デフォルトはNULLポインターです。この場合、破損は発生しません。StartStreaming
委任された関数ポインタを使用すると、ヒープが破損しますRTSPConnection
ネイティブC++で実装され、C呼び出しも含まれています(libavcodec)RTSPConnection
通信とフレームディスパッチスレッドの2つのスレッドが含まれています(マネージドコールバックを呼び出します)
誰かが私にパンくずをくれませんか?よろしくお願いします。