解决方案 »

  1.   

    你是不是把Form对象关了?如果Form被回收的话,RealDataCallBack函数就一并完了。
      

  2.   

    你的thread 会被回收吧,你每次click都创建新的thread,老的就没有引用了,使用thread[]试试
      

  3.   

    把private void RealDataCallBack(Int32 lRealHandle, UInt32 dwDataType, IntPtr pBuffer, UInt32 dwBufSize, IntPtr pUser)
    定义成static试试
      

  4.   

    我原先也怀疑thread被回收了,不过我开8路预览的时候在监控里还是看到8个线程
      

  5.   

    果然是这个问题,最后的做法: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,结贴给分。
      

  6.   

    我原先也怀疑thread被回收了,不过我开8路预览的时候在监控里还是看到8个线程
    自己测试了一下,用同一个线程对象new,和重新定义个线程变量new,没有什么区别.
    即使在click里每次重新定义,click执行完,线程对象也被释放了.
      

  7.   

    [ThreadStatic]
    private static REALDATACALLBACK RealData;
    这样定义