C#非托管跨线程委托调试,

2019-11-07 作者:计算机教程   |   浏览(130)

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#的回调函数,这时程序只会弹出此窗口提示:

图片 1

 

所以现在只能暂时使用C#建立工作线程,去主动调用C 的函数,在C 中通过信号量阻塞的方式实现事件触发。

 

http://www.bkjia.com/C_jc/1204696.htmlwww.bkjia.comtruehttp://www.bkjia.com/C_jc/1204696.htmlTechArticleC#非托管跨线程委托调试, 使用C#调用mingw的so文件,拿视频数据回wpf的界面进行显示,注册了回调函数。C 在调用回调函数时遇到了委托被...

本文由www.2003.com发布于计算机教程,转载请注明出处:C#非托管跨线程委托调试,

关键词: