急!!C#引用C++委托错误,委托被回收问题 delegate海康视频c++C# 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你是不是把Form对象关了?如果Form被回收的话,RealDataCallBack函数就一并完了。 你的thread 会被回收吧,你每次click都创建新的thread,老的就没有引用了,使用thread[]试试 把private void RealDataCallBack(Int32 lRealHandle, UInt32 dwDataType, IntPtr pBuffer, UInt32 dwBufSize, IntPtr pUser)定义成static试试 我原先也怀疑thread被回收了,不过我开8路预览的时候在监控里还是看到8个线程 果然是这个问题,最后的做法:public delegate void REALDATACALLBACK(Int32 lRealHandle, UInt32 dwDataType, IntPtr pBuffer, UInt32 dwBufSize, IntPtr pUser);[DllImport("HCNetSDK.dll")]public static extern int NET_DVR_RealPlay_V40(int iUserID, ref NET_DVR_PREVIEWINFO lpPreviewInfo, Delegate fRealDataCallBack_V30, IntPtr pUser);//引用 public partial class Form1 : Form { private REALDATACALLBACK RealData=new REALDATACALLBACK(RealDataCallBack); // 开始获取视频流 private void RunGetStream(int channels) { int m_lRealHandle = CHCNetSDK.NET_DVR_RealPlay_V40(m_lUserID, ref lpPreviewInfo, RealData, pUser); } // 视频流回调 private static void RealDataCallBack(Int32 lRealHandle, UInt32 dwDataType, IntPtr pBuffer, UInt32 dwBufSize, IntPtr pUser) { byte[] data = new byte[dwBufSize]; Marshal.Copy(pBuffer, data, 0, (int)dwBufSize); if (dwDataType == CHCNetSDK.NET_DVR_SYSHEAD)//是视频头,不发送,存起来 { byte[] newData = new byte[40]; newData = data; } else//是视频数据,发送给客户端 { } }Thread thread ; //获取通道X视频 private void button1_Click(object sender, EventArgs e) { thread = new Thread((object o) => { RunGetStream(); }); thread.IsBackground = true; thread.Start(); }}这样问题解决了,要在委托方法前加static,结贴给分。 我原先也怀疑thread被回收了,不过我开8路预览的时候在监控里还是看到8个线程自己测试了一下,用同一个线程对象new,和重新定义个线程变量new,没有什么区别.即使在click里每次重新定义,click执行完,线程对象也被释放了. [ThreadStatic]private static REALDATACALLBACK RealData;这样定义 string.Format("abc{123}"),报错 点击按钮 月份增减 求教简单Array转ArrayList 类型转换 谁能给出以下问题答案 --面试题(3) PropertyGrid动态加属性(急,在线等!帮帮忙) 求救!怎样调用存储过程? 菜鸟求一多线程思路:对数据库表中多条记录进行处理 弱弱地问个问题,论坛里经常提到的MSDN到底是什么? VS2005C#.net C# wpf 的listbox 控件 CheckedListBox控件选择一个项,为什么要点击2次才能加上勾?
定义成static试试
[DllImport("HCNetSDK.dll")]
public static extern int NET_DVR_RealPlay_V40(int iUserID, ref NET_DVR_PREVIEWINFO lpPreviewInfo, Delegate fRealDataCallBack_V30, IntPtr pUser);//引用
public partial class Form1 : Form
{
private REALDATACALLBACK RealData=new REALDATACALLBACK(RealDataCallBack);
// 开始获取视频流
private void RunGetStream(int channels)
{
int m_lRealHandle = CHCNetSDK.NET_DVR_RealPlay_V40(m_lUserID, ref lpPreviewInfo, RealData, pUser);
}
// 视频流回调
private static void RealDataCallBack(Int32 lRealHandle, UInt32 dwDataType, IntPtr pBuffer, UInt32 dwBufSize, IntPtr pUser)
{
byte[] data = new byte[dwBufSize];
Marshal.Copy(pBuffer, data, 0, (int)dwBufSize);
if (dwDataType == CHCNetSDK.NET_DVR_SYSHEAD)//是视频头,不发送,存起来
{
byte[] newData = new byte[40];
newData = data;
}
else//是视频数据,发送给客户端
{
}
}
Thread thread ;
//获取通道X视频
private void button1_Click(object sender, EventArgs e)
{
thread = new Thread((object o) =>
{
RunGetStream();
});
thread.IsBackground = true;
thread.Start();
}
}这样问题解决了,要在委托方法前加static,结贴给分。
自己测试了一下,用同一个线程对象new,和重新定义个线程变量new,没有什么区别.
即使在click里每次重新定义,click执行完,线程对象也被释放了.
private static REALDATACALLBACK RealData;
这样定义