首页 > 代码库 > C#非托管跨线程委托调试
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++中通过信号量阻塞的方式实现事件触发。
C#非托管跨线程委托调试
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。