/// <summary>
        /// 重连设备
        /// </summary>
        /// <param name="IUserId"></param>
        /// <returns></returns>
        public int DeviceReconnect(int IUserId)
        {
            SDKPlugInData.DEVICEINFO deviceinfo = new SDKPlugInData.DEVICEINFO();
            ILoginData loginData = loginDataList.FindByLoginDataHandle(IUserId);

            uint lastLoginHandle = 0;

            if (loginData != null)
            {
                lastLoginHandle = loginData.LoginHandle;
                int loginHandle = DeviceLogin(loginData.DeviceIP, loginData.DevicePort, loginData.UserName,
                                              loginData.Password, ref deviceinfo,
                                              loginData.servername);

                if (loginHandle != -1)
                {
                    //DeviceLogout(IUserId);
                    RealHandleDataList rlist = new RealHandleDataList();

                    //查找
                    foreach (IRealHandleData realHandleData in realHandleDataList)
                    {
                        if (realHandleData.LoginHandle == loginData.LoginDataHandle)
                        {
                            rlist.Add(realHandleData);
                        }
                    }

                    //重播
                    if (rlist.Count != 0)
                    {
                        foreach (IRealHandleData realHandleData in rlist)
                        {
                            if (!lastRealPlayHandleHT.Contains(realHandleData.WndHandle))
                            {
                                lastRealPlayHandleHT.Add(realHandleData.WndHandle, realHandleData.RealPlayHandle);
                            }
                            else
                            {
                                lastRealPlayHandleHT[realHandleData.WndHandle] = realHandleData.RealPlayHandle;
                            }

                            if (realHandleData.WndHandle != IntPtr.Zero)
                            {
                                //lastRealPlayHandle = realHandleData.RealPlayHandle;
                                if (RealPlay(loginHandle, realHandleData.ChannelNo, realHandleData.WndHandle) == -1)
                                {
                                    DeviceLogout(Convert.ToInt32(loginData.LoginHandle));
                                    loginData.LoginHandle = lastLoginHandle;
                                    //Console.WriteLine(string.Format("不成功 {0} data{1} handle {2} ", loginData.DeviceIP, loginData.LoginDataHandle, loginData.LoginHandle));
                                    TraceDbg(string.Format("不成功 {0} data{1} handle {2} ", loginData.DeviceIP, loginData.LoginDataHandle, loginData.LoginHandle));
                                    return -1;
                                }
                                else
                                {
                                    StopRealPlay(realHandleData.RealPlayHandle);
                                }
                            }
                            else
                            {
                                int ral = SaveNoRealData(loginHandle, realHandleData.ChannelNo, string.Format(@"c:\temp{0}{1}.mpp",loginHandle,realHandleData.ChannelNo));
                                if (ral != -1)
                                {
                                    bool b = StopSaveNoRealData(ral);
                                    //Console.WriteLine("停止temp " + b.ToString());
                                    TraceDbg("停止temp " + b.ToString());
                                }
                                else
                                {
                                    DeviceLogout(Convert.ToInt32(loginData.LoginHandle));
                                    loginData.LoginHandle = lastLoginHandle;
                                    //Console.WriteLine(string.Format("不成功 {0} data{1} handle {2} ", loginData.DeviceIP, loginData.LoginDataHandle, loginData.LoginHandle));
                                    TraceDbg(string.Format("不成功 {0} data{1} handle {2} ", loginData.DeviceIP, loginData.LoginDataHandle, loginData.LoginHandle));
                                    return -1;
                                }
                            }
                        }
                    }

                    DeviceLogout(Convert.ToInt32(lastLoginHandle));
                    return loginHandle;
                }
                else
                {
                    return -1;
                }
            }
            else
            {
                return -1;
            }
        }
        /// <summary>
        /// ע���豸
        /// </summary>
        /// <param name="device">�豸</param>
        private void LoginDevice(IDevice device, bool IsReconnect)
        {
            TwoEventArgs args = new TwoEventArgs();
            args.Obj1 = device;

            if (device.PTLSN == -1) // �ò�����������ͼƬ��Ϊ�����ʾ
            {
                //TODO:���豸û�������������ҵ����ʵ���������
                //SetDeviceErr(device, true);
                device.IsInWorking = false;

                args.Obj2 = true;
                this.BeginInvoke(new EventHandler(SetDeviceErrUI), args);

                //device.DeviceHandle = -1;
                //dsi.UserID = -1;
                SetDevieHandle(device, -1);
            }
            else
            {
                if (!Convert.ToBoolean(device.DeviceWorkState)) // �豸����
                {
                    if (sdklibrarys[device.PTLSN].Enable) // ��������������
                    {
                        SDKPlugInData.DEVICEINFO info = new SDKPlugInData.DEVICEINFO();

                        int userID = -1;

                        if (IsReconnect)
                        {
                            userID = sdklibrarys[device.PTLSN].DeviceReconnect(device.DeviceHandle);
                        }
                        else
                        {
                            userID = sdklibrarys[device.PTLSN].DeviceLogin(device.DeviceIP, (ushort)device.DevicePort,
                                                                           device.DeviceUserName,
                                                                           device.DevicePWD, ref info, device.DeviceName);
                        }

                        SetDevieHandle(device, userID);
                        //device.DeviceHandle =
                        //dsi.UserID = device.DeviceHandle;
                        if (device.DeviceHandle != -1)
                        {
                            //����
                            sdklibrarys[device.PTLSN].SetupAlarmChan(device.DeviceHandle, device.DeviceID);
                        }

                        if (device.DeviceHandle == -1)
                        {
                            //TODO:���豸ע��ʧ��
                            device.IsInWorking = false;

                            args.Obj2 = true;
                            this.BeginInvoke(new EventHandler(SetDeviceErrUI), args);
                        }
                        else
                        {
                            //ע��ɹ�
                            device.IsInWorking = true;

                            args.Obj2 = false;
                            this.BeginInvoke(new EventHandler(SetDeviceErrUI), args);
                        }
                    }
                    else
                    {
                        //TODO:���豸�����Ѿ���ͣ��
                        device.IsInWorking = false;

                        args.Obj2 = true;
                        this.BeginInvoke(new EventHandler(SetDeviceErrUI), args);
                    }
                }
                else
                {
                    //TODO:�豸������
                    device.IsInWorking = false;

                    args.Obj2 = true;
                    this.BeginInvoke(new EventHandler(SetDeviceErrUI), args);
                }
            }
        }