예제 #1
0
        private void ProcessRequests(object aRgUmEnT)
        {
            ProcessRequestArgs arg = aRgUmEnT as ProcessRequestArgs;

            if (arg == null)
            {
                return;
            }
            if (!processRequestsMutex.WaitOne(3000))
            {
                return;
            }
            try
            {
                //Обработаем все запросы, связанные с таймером
                using (SqlConnection cn = new SqlConnection(arg.ConnectionString))
                {
                    cn.Open();
                    List <Pair <ClimbingTimerCommand, string> > listParams = new List <Pair <ClimbingTimerCommand, string> >();
                    SqlTransaction tran = cn.BeginTransaction();
                    try
                    {
                        SqlCommand cmd = new SqlCommand("SELECT REQUEST, PARAM, sys_date, GetDate() curDate" +
                                                        "  FROM prg_Qs(NOLOCK)" +
                                                        " WHERE MACHINE <> " + MACHINE_PARAM_ID, cn);
                        AddMachineID(cmd);
                        cmd.Transaction = tran;
                        using (SqlDataReader rdr = cmd.ExecuteReader())
                        {
                            while (rdr.Read())
                            {
                                try
                                {
                                    ClimbingTimerCommand c = StaticClass.GetEnumValueFromStringNumeric <ClimbingTimerCommand>(rdr[0] as string);
                                    if (ContainsTimerData(c))
                                    {
                                        listParams.Add(new Pair <ClimbingTimerCommand, string>(c, rdr[1] as string, (DateTime)rdr[2], (DateTime)rdr[3]));
                                    }
                                }
                                catch (FormatException) { }
                            }
                        }
                        bool dataInserted = false;
                        foreach (var v in listParams)
                        {
                            #region ForEachParam
                            //Если мы запрашивали синхронизацию, то обновим значение
                            bool synchroNeeded = endPoints.Count < 1 && !arg.IsMain && (arg.Parent.autoSynchro || !arg.Parent.firstSynchroCompleted);
                            if (synchroNeeded && ((v.Value1 & ClimbingTimerCommand.Timer_SynchroCompleted) == ClimbingTimerCommand.Timer_SynchroCompleted))
                            {
                                int[]    vals = new int[4];
                                string[] s    = v.Value2.Split(new char[] { ' ', ';' }, StringSplitOptions.RemoveEmptyEntries);
                                if (s.Length < 4)
                                {
                                    continue;
                                }
                                try
                                {
                                    for (int i = 0; i < vals.Length; i++)
                                    {
                                        vals[i] = int.Parse(s[i]);
                                    }
                                }
                                catch (FormatException) { continue; }
                                /*обновим остаток*/
                                if (Monitor.TryEnter(arg.Locker, 2000))
                                {
                                    try
                                    {
                                        TimeSpan oldBase = new TimeSpan(0, vals[0], vals[1]);
                                        oldBase -= (v.DateSelected - v.DateUpdated);
                                        arg.Parent.remainingInterval     = oldBase;
                                        arg.Parent.rotationInterval      = new TimeSpan(0, vals[2], vals[3]);
                                        arg.Parent.lastSignal            = v.DateSelected;
                                        arg.Parent.firstSynchroCompleted = true;
                                    }
                                    finally { Monitor.Exit(arg.Locker); }
                                    arg.Parent.Start();
                                }
                            }
                            if (arg.IsMain && ((v.Value1 & ClimbingTimerCommand.Timer_SynchroRequest) == ClimbingTimerCommand.Timer_SynchroRequest))
                            {
                                //Если кто-то запрашивает синхронизацию
                                //Ответ поставим только один раз
                                if (!dataInserted)
                                {
                                    cmd.Parameters.Clear();
                                    cmd.CommandText = "DELETE FROM prg_Qs WHERE REQUEST IN(@sr, @sc)";
                                    cmd.Parameters.Add("@sr", SqlDbType.VarChar, 255).Value =
                                        StaticClass.GetEnumStringNumericValue(ClimbingTimerCommand.Timer_SynchroRequest);
                                    cmd.Parameters.Add("@sc", SqlDbType.VarChar, 255).Value =
                                        StaticClass.GetEnumStringNumericValue(ClimbingTimerCommand.Timer_SynchroCompleted);
                                    cmd.ExecuteNonQuery();
                                    cmd.CommandText = "INSERT INTO prg_Qs (REQUEST, PARAM, MACHINE) VALUES (@sc,@p," + MACHINE_PARAM_ID + ")";
                                    AddMachineID(cmd);
                                    if (Monitor.TryEnter(arg.Locker, 5000))
                                    {
                                        try
                                        {
                                            cmd.Parameters.Add("@p", SqlDbType.VarChar, 255).Value =
                                                Math.Truncate(arg.Parent.remainingInterval.TotalMinutes).ToString("0") + ";" +
                                                arg.Parent.remainingInterval.Seconds.ToString() + ";" +
                                                Math.Truncate(arg.Parent.rotationInterval.TotalMinutes).ToString("0") + ";" +
                                                arg.Parent.rotationInterval.Seconds.ToString();
                                            cmd.ExecuteNonQuery();
                                            dataInserted = true;
                                        }
                                        finally { Monitor.Exit(arg.Locker); }
                                    }
                                }
                            }
                            #endregion
                        }
                        if (!arg.IsMain && endPoints.Count < 1)
                        {
                            if (Monitor.TryEnter(arg.Locker, 1000))
                            {
                                try
                                {
                                    cmd.Parameters.Clear();
                                    cmd.CommandText = "INSERT INTO prg_Qs (REQUEST, MACHINE, PARAM) VALUES(@sr," + MACHINE_PARAM_ID + ", '-')";
                                    cmd.Parameters.Add("@sr", SqlDbType.VarChar, 255).Value =
                                        StaticClass.GetEnumStringNumericValue(ClimbingTimerCommand.Timer_SynchroRequest);
                                    AddMachineID(cmd);
                                    cmd.ExecuteNonQuery();
                                }
                                finally { Monitor.Exit(arg.Locker); }
                            }
                        }
                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        try { tran.Rollback(); }
                        catch { }
                        throw ex;
                    }
                }
            }
            catch (ThreadAbortException) { return; }
            catch { }
            finally { processRequestsMutex.ReleaseMutex(); }
        }
예제 #2
0
 private static bool ContainsTimerData(ClimbingTimerCommand c)
 {
     return(ContainsTimerData((byte)c));
 }