使用C#調用mingw的so文件,拿視頻數據回wpf的界面進行顯示,註冊了回調函數。C++在調用回調函數時遇到了委托被回收的問題,提示:“類型的已垃圾回收委托進行了回調。這可能會導致應用程式崩潰、損壞和數據丟失。向非托管代碼傳遞委托時,托管應用程式必須讓這些委托保持活動狀態,直到確信不會再次調用它們 ...
使用C#調用mingw的so文件,拿視頻數據回wpf的界面進行顯示,註冊了回調函數。C++在調用回調函數時遇到了委托被回收的問題,提示:“類型的已垃圾回收委托進行了回調。這可能會導致應用程式崩潰、損壞和數據丟失。向非托管代碼傳遞委托時,托管應用程式必須讓這些委托保持活動狀態,直到確信不會再次調用它們。”
此問題在程式正常運行一段時間後出現。從gdb調試器中看到的效果是所有變數都正常,運行到回調函數時segmentation fault
通過c++直接調用opencv的imshow顯示圖像,並且使用的Mat是由指針和size重新構造的,證明瞭數據準備是沒問題的,應該是回調函數調用的問題
網上看人家的解決辦法:
- 把委托定義為static的成員變數;
- 把回調函數定義成static;
- 讓GC不回收委托GC.KeepAlive(display_cb);
- 在變數前加標簽:
- [ThreadStatic]
- static public Mingw.DISPLAY_CB display_cb;
但這些辦法只能解決單線程調用回調函數的情況,這種情況下VS2010調試器會彈出錯誤提示,說“類型的已垃圾回收委托進行了回調。這可能會導致應用程式崩潰、損壞和數據丟失。向非托管代碼傳遞委托時,托管應用程式必須讓這些委托保持活動狀態,直到確信不會再次調用它們。”
而在動態庫中C++代碼開了另一個線程去調用C#的回調函數,這時程式只會彈出此視窗提示:
所以現在只能暫時使用C#建立工作線程,去主動調用C++的函數,在C++中通過信號量阻塞的方式實現事件觸發。