我試圖將託管函數指針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
與委託ED函數指針導致堆損壞RTSPConnection
在本地C++實現和含有C呼叫以及(libavcodec的)RTSPConnection
包含兩個線程,通信和幀調度線程(調用管理回調)
有人給我一個麪包屑?提前謝謝你。
嘿夢露,你的意思是WorkerThreadFunc?在我真正的電話中,我在我的frame_callback中有GUI調用,並且我在'Form :: Update()'委託上使用'BeginInvoke'。 – Constantin
@Constantin我通過經驗發現,執行BeginInvoke的最佳位置應該在Form實例本身中......它擁有最好的上下文來知道調用線程是否是UI線程。 –
啊,我現在看到你沒有在frame_callback中調用任何UI函數;我的錯。也許刪除__cdecl? –