调试时正常运行
运行时却报错。
运行时却报错。
解决方案 »
- 求图像 向内或外偏移固定像素的算法
- DirectShow中的IMediaDet
- 我想用Windows图片和传真查看器打开内存中的图片,没做过啊?
- 请问C#种的BackColor可以用颜色的代码来设定值吗?
- passwordchar 的简单问题
- DataGridView如何屏蔽用户输入值(只允许其输入数字)。
- 急啊!在线等!~Microsoft SQL Server 2000 Windows CE Edition的安装问题!
- 请问:为什么我不能在winform项目中建立config文件?
- datagridviewbuttoncolumn
- unity3d中c#的使用
- 数据库INT型
- 数据存储、提取问题,100分~~
[return: MarshalAs(UnmanagedType.Bool)]
public unsafe static extern bool PlayM4_ConvertToBmpFile(IntPtr pBuf, int nSize, int nWidth, int nHeight, int nType, string sFileName); public delegate void CallBack(int nPort, IntPtr pBuf, int nSize, int nWidth, int nHeight, int nStamp, int nType, int nReceaved); [DllImport("playm4.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public unsafe static extern bool PlayM4_SetDisplayCallBack(int nPort,CallBack cb);
private void DisplayCBFun(int nPort,IntPtr pBuf,int nSize,int nWidth,int nHeight,int nStamp,int nType,int nReceaved)
{
// GC.Collect();
if(!g_bCapPic)
return;
//转换函数,比较耗时,如果不想保存图片,请不要调用;
string csDir;
string csFile;
DateTime time=System.DateTime .Now; csFile ="C:\\Picture\\"+time.ToString("yyyy-MM-dd-HH-mm-ss") + ".bmp";
if(!PlayM4_ConvertToBmpFile(pBuf,nSize,nWidth,nHeight,nType,csFile))
{
MessageBox.Show("不成功!");
}
// this.CapPicName = csFile;
g_bCapPic=false;
}
调用的地方
CallBack cb = new CallBack(this.DisplayCBFun);
PlayM4_SetDisplayCallBack(USED_PORT, cb);
if ((PlayM4_Play(99, this.panel1.Handle)) == false)
{
PlayM4_CloseFile(USED_PORT);
return;
}//出错的地方就是这个回调的过程。去掉回调就没问题了。。
{
GC.Collect();
在调试时是不去掉的。
负责调试时就报错
private void DisplayCBFun(int nPort,IntPtr pBuf,int nSize,int nWidth,int nHeight,int nStamp,int nType,int nReceaved)
{
GC.Collect();
在调试时是不去掉的。
负责调试时就报错------------------------------------------------------------
那为什么在运行时又要去掉呢?
GC.Collect();
会出现
对“CZHDFX!CZHDFX.VideoCallBack+CallBack::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
GC.Collect();
会出现
对“CZHDFX!CZHDFX.VideoCallBack+CallBack::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
---------------------------------------------------------------------------
这个说明了委托线程被释放首先确定你的调用线程 和你的委托线程具有更长的生命期
GC.Collect(); 可能收集了还在使用的对象
{
PlayM4_CloseFile(USED_PORT);
return;
}
------------------------------------------------------------------------
确定一下 PlayM4_Play 函数是不是在本线程执行 还是另起新线程
如果是另起的话 毛病是在这了
CallBack cb = new CallBack(this.DisplayCBFun); //
PlayM4_SetDisplayCallBack(USED_PORT, cb); //去掉这两行程序就好了还是回掉出错。
if ((PlayM4_Play(99, this.panel1.Handle)) == false)
{
PlayM4_CloseFile(USED_PORT);
return;
}
CallBack cb = new CallBack(this.DisplayCBFun);
如果是写在方法中的,那么改到类中,作为类的私有成员试一下
确保委托实例的生存期覆盖非托管代码的期;
否则,委托在经过垃圾回收后将不再可用我这出错也就是上边。
可是如何确保呢???--------------------------------------------------
不要让垃圾回收器回收这个回调函数和它使用的资源试试!
对“CZHDFX!CZHDFX.VideoCallBack+CallBack::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。时不时会提示这样的错误。------------------------------------------------------------------
用GCHandle.Alloc()方法将CallBack锁住,这样GC就不会回收这个CallBack了!