using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using DBFactory;
using CommonLib;
using System.Threading;

namespace WcfControlMonitorLib
{
    public static class CUpdateIoControl
    {
        //static Thread mythread;
        static Thread mythreadDarkCasket;               //NewWrieDarkCasket 位置4.1    
        static bool exitThreadDarkCasket = false;       //NewWrieDarkCasket 位置4.2 
        static string _CUpdateIoControlError = "";//监控调度类错误说明

        public static string CUpdateIoControlError
        {
            get { return _CUpdateIoControlError; }
            set { _CUpdateIoControlError = value; }
        }
        public static event RefreshMonitorEventHandler RefreshMonitor;
        public static void OnRefreshMonitor(RefreshMonitorEventArgs e)
        {
            if (RefreshMonitor != null)
            {
                RefreshMonitor(e);
            }
        }
        static StringBuilder temp = new StringBuilder();
        static DBOperator dbo = new DBOperator();
        static object lockThis = new object();
        static object lockThisDarkCasket = new object(); //NewWrieDarkCasket 位置4.3
        public static List<string> sql = new List<string>();

        //NewWrieDarkCasket 位置6
        private static void BeginListenDarkCasket()
        {//20091107
            while (!exitThreadDarkCasket)
            {
                try
                {
                    lock (lockThisDarkCasket)
                    {//20130226richard.liu
                        RunDark();
                    }
                }
                catch (Exception ex)
                {
                    _CUpdateIoControlError = ex.StackTrace + ex.Message;
                }
                finally
                {
                    Thread.Sleep(200); //200ms 查看一次
                }
            }
        }

        //NewWrieDarkCasket 位置8 
        public static void EndListen()
        {
            #region NewWrieDarkCasket 位置8.1
            if (CommonClassLib.CCarryConvert.dark.Count == 0)
            {
                exitThreadDarkCasket = true;
                if (mythreadDarkCasket != null)
                {
                    mythreadDarkCasket.Abort();
                    mythreadDarkCasket = null;
                }
            }
            else
            {
                if (mythreadDarkCasket == null)
                {
                    mythreadDarkCasket = new Thread(new ThreadStart(BeginListenDarkCasket));
                    mythreadDarkCasket.IsBackground = true;
                    mythreadDarkCasket.Start();
                    while (true)
                    {
                        if (CommonClassLib.CCarryConvert.dark.Count == 0)
                        {
                            exitThreadDarkCasket = true;
                            mythreadDarkCasket.Abort();
                            mythreadDarkCasket = null;
                            break;
                        }
                    }
                }
                else
                {
                    while (true)
                    {
                        if (CommonClassLib.CCarryConvert.dark.Count == 0)
                        {
                            exitThreadDarkCasket = true;
                            mythreadDarkCasket.Abort();
                            mythreadDarkCasket = null;
                            break;
                        }
                    }
                }

            }
            #endregion

        }

        //NewWrieDarkCasket 位置5 
        public static void StartListen()
        {
            exitThreadDarkCasket = false;
            mythreadDarkCasket = new Thread(new ThreadStart(BeginListenDarkCasket));    //新建线程mythreadDarkCasket处理黑匣子
            mythreadDarkCasket.IsBackground = true;
            mythreadDarkCasket.Start();

        }
        //NewWrieDarkCasket 位置7
        public static void RunDark()
        {

            if (CommonClassLib.CCarryConvert.dark.Count > 0)
            {
                for (int i = 0; i < CommonClassLib.CCarryConvert.dark.Count; i++)
                {
                    try
                    {
                        if (CommonClassLib.CCarryConvert.dark[i] == null) break;  //dark中数量近万时,偶尔会出现 dark[0] 值为null
                        string[] aaa = CommonClassLib.CCarryConvert.dark[i].ToString().Split('|');
                        CommonClassLib.CCarryConvert.kkk(aaa[0], aaa[1], aaa[2], aaa[3], aaa[4]); //将 dark[i] 的记录写入文件中
                        //dbo1.ExecuteSql("insert into test(T1) values('" + sql[i].ToString() + "')");

                    }
                    catch (Exception exa)
                    {

                        _CUpdateIoControlError = string.Format("解析PLC反馈数据的记录设备状态时发生错误:{0}", exa.StackTrace + exa.Message);
                        RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", _CUpdateIoControlError);
                        OnRefreshMonitor(rmea);
                    }
                    finally
                    {
                        CommonClassLib.CCarryConvert.dark.RemoveAt(i);//移除 dark[i]
                        i--;
                    }
                }
            }
        }
    }
}