private void threadPost(object par)
        {
            while (true)
            {
                INDEX_SEMATHREAD indx_semathread = (INDEX_SEMATHREAD)WaitHandle.WaitAny(m_arEvtThread);

                //Отправление сообщений...
                int    err    = -1;
                string toPost = string.Empty;

                if (m_listQueueMessage.Count > 0)
                {
                    switch (s_mode)
                    {
                    case LOG_MODE.DB:
                        if (m_evtConnSett.WaitOne(0, true) == true)
                        {
                            lock (m_objQueueMessage)
                            {
                                ////Отладка!!!
                                //Console.WriteLine(@"Логгирование: сообщений на вХоде=" + m_listQueueMessage.Count);

                                int indx_queue = 0
                                , cnt_running  = 0;
                                while ((indx_queue < m_listQueueMessage.Count) && (cnt_running < MAX_COUNT_MESSAGE_ONETIME))
                                {
                                    if (m_listQueueMessage[indx_queue].m_state == STATE_MESSAGE.QUEUE)
                                    {
                                        toPost += getInsertQuery(m_listQueueMessage[indx_queue]) + @";";
                                        m_listQueueMessage[indx_queue].m_state = STATE_MESSAGE.RUNNING;

                                        cnt_running++;
                                    }
                                    else
                                    {
                                        ;
                                    }

                                    indx_queue++;
                                }
                            }

                            DbTSQLInterface.ExecNonQuery(ref s_dbConn, toPost, null, null, out err);

                            if (!(err == 0))
                            {     //Ошибка при записи сообщений...
                                retryQueueMessage();

                                disconnect();
                                m_evtConnSett.Reset();
                            }
                            else
                            {     //Успех при записи сообщений...
                                clearQueueMessage();
                            }

                            ////Отладка!!!
                            //lock (m_objQueueMessage)
                            //{
                            //    Console.WriteLine(@"Логгирование: сообщений на вЫходе=" + m_listQueueMessage.Count);
                            //    foreach (MESSAGE msg in m_listQueueMessage)
                            //        Console.WriteLine(@"Тип сообщения=" + msg.m_state.ToString ());
                            //}
                        }
                        else
                        {
                            ;     //Нет соединения с БД
                        }
                        break;

                    case LOG_MODE.FILE_EXE:
                    case LOG_MODE.FILE_DESKTOP:
                    case LOG_MODE.FILE_LOCALDEV:
                    case LOG_MODE.FILE_NETDEV:
                        bool locking = false;
                        if ((!(m_listQueueMessage == null)) && (m_listQueueMessage.Count > 0))
                        {
                            lock (m_objQueueMessage)
                            {
                                int indx_queue = 0;
                                while (indx_queue < m_listQueueMessage.Count)
                                {
                                    if (m_listQueueMessage[indx_queue].m_bSeparator == true)
                                    {
                                        toPost += MessageSeparator + Environment.NewLine;
                                    }
                                    else
                                    {
                                        ;
                                    }

                                    if (m_listQueueMessage[indx_queue].m_bDatetimeStamp == true)
                                    {
                                        toPost += m_listQueueMessage[indx_queue].m_strDatetimeReg + Environment.NewLine;
                                        toPost += DatetimeStampSeparator + Environment.NewLine;
                                    }
                                    else
                                    {
                                        ;
                                    }

                                    toPost += m_listQueueMessage[indx_queue].m_text + Environment.NewLine;

                                    if (m_listQueueMessage.Count == 1)
                                    {
                                        locking = m_listQueueMessage[indx_queue].m_bLockFile;
                                    }
                                    else
                                    {
                                        ;
                                    }

                                    if (locking == false)
                                    {
                                        if ((DateTime.Now - logRotateCheckLast).TotalSeconds > logRotateChekMaxSeconds)
                                        {
                                            //Принудить к проверке размера файла
                                            locking = true;
                                        }
                                        else
                                        {
                                            ;
                                        }
                                    }
                                    else
                                    {
                                        ;
                                    }

                                    m_listQueueMessage[indx_queue].m_state = STATE_MESSAGE.RUNNING;

                                    indx_queue++;
                                }
                            }

                            if (locking == true)
                            {
                                LogLock();
                                LogCheckRotate();
                            }
                            else
                            {
                                ;
                            }

                            if (File.Exists(m_fileName) == true)
                            {
                                try
                                {
                                    if ((m_sw == null) || (m_fi == null))
                                    {
                                        //Вариант №1
                                        //FileInfo f = new FileInfo(m_fileName);
                                        //FileStream fs = f.Open(FileMode.Append, FileAccess.Write, FileShare.Write);
                                        //m_sw = new LogStreamWriter(fs, Encoding.GetEncoding("windows-1251"));
                                        //Вариант №2
                                        m_sw = new LogStreamWriter(m_fileName, true, Encoding.GetEncoding("windows-1251"));

                                        m_fi = new FileInfo(m_fileName);
                                    }
                                    else
                                    {
                                        ;
                                    }

                                    m_sw.Write(toPost);
                                    m_sw.Flush();
                                }
                                catch (Exception e)
                                {
                                    retryQueueMessage();

                                    /*m_sw.Close ();*/
                                    m_sw = null;
                                    m_fi = null;
                                }
                            }
                            else
                            {
                                retryQueueMessage();
                            }

                            //if (externalLog == true)
                            //{
                            //    if (timeStamp == true)
                            //        delegateUpdateLogText(DateTime.Now.ToString() + ": " + message + Environment.NewLine);
                            //    else
                            //        delegateUpdateLogText(message + Environment.NewLine);
                            //}
                            //else
                            //    ;

                            clearQueueMessage();

                            if (locking == true)
                            {
                                LogUnlock();
                            }
                            else
                            {
                                ;
                            }
                        }
                        else
                        {
                        }
                        break;

                    case LOG_MODE.UNKNOWN:
                    default:
                        break;
                    }
                }
                else
                {
                    ;
                }

                if (indx_semathread == INDEX_SEMATHREAD.STOP)
                {
                    break;
                }
                else
                {
                    m_arEvtThread[(int)INDEX_SEMATHREAD.MSG].Reset();
                }
            }
        }
Beispiel #2
0
        private void threadPost(object par)
        {
            while (true)
            {
                INDEX_SEMATHREAD indx_semathread = (INDEX_SEMATHREAD)WaitHandle.WaitAny(m_arEvtThread);

                //Отправление сообщений...
                int    err    = -1;
                string toPost = string.Empty;

                if (m_listQueueMessage.Count > 0)
                {
                    switch (s_mode)
                    {
                    case LOG_MODE.DB:
                        if (m_evtConnSett.WaitOne(0) == true)
                        {
                            lock (m_objQueueMessage)
                            {
                                ////Отладка!!!
                                //Console.WriteLine(@"Логгирование: сообщений на вХоде=" + m_listQueueMessage.Count);

                                int indx_queue = 0
                                , cnt_running  = 0;
                                while ((indx_queue < m_listQueueMessage.Count) && (cnt_running < MAX_COUNT_MESSAGE_ONETIME))
                                {
                                    if (m_listQueueMessage[indx_queue].m_state == STATE_MESSAGE.QUEUE)
                                    {
                                        toPost += getInsertQuery(m_listQueueMessage[indx_queue]) + @";";
                                        m_listQueueMessage[indx_queue].m_state = STATE_MESSAGE.RUNNING;

                                        cnt_running++;
                                    }
                                    else
                                    {
                                        ;
                                    }

                                    indx_queue++;
                                }
                            }

                            DbTSQLInterface.ExecNonQuery(ref s_dbConn, toPost, null, null, out err);

                            if (!(err == 0))
                            {     //Ошибка при записи сообщений...
                                lock (m_objQueueMessage)
                                {
                                    //Постановка ПОВТОРно сообщений в очередь
                                    foreach (MESSAGE msg in m_listQueueMessage)
                                    {
                                        if (msg.m_state == STATE_MESSAGE.RUNNING)
                                        {
                                            msg.m_state = STATE_MESSAGE.QUEUE;
                                        }
                                        else
                                        {
                                            ;
                                        }
                                    }
                                }

                                disconnect();
                                m_evtConnSett.Reset();
                            }
                            else
                            {     //Успех при записи сообщений...
                                lock (m_objQueueMessage)
                                {
                                    //Найти обработанные сообщения
                                    List <int> listIndxMsgRunning = new List <int>();
                                    foreach (MESSAGE msg in m_listQueueMessage)
                                    {
                                        if (msg.m_state == STATE_MESSAGE.RUNNING)
                                        {
                                            listIndxMsgRunning.Add(m_listQueueMessage.IndexOf(msg));
                                        }
                                        else
                                        {
                                            ;
                                        }
                                    }

                                    //Сортировать список индексов в ОБРАТном порядке
                                    // для удаления сообщений из списка по ИНДЕКСу
                                    listIndxMsgRunning.Sort(delegate(int i1, int i2) { return(i1 > i2 ? -1 : 1); });

                                    //Удалить обработанные сообщения
                                    foreach (int indx in listIndxMsgRunning)
                                    {
                                        m_listQueueMessage.RemoveAt(indx);
                                    }
                                }
                            }

                            ////Отладка!!!
                            //lock (m_objQueueMessage)
                            //{
                            //    Console.WriteLine(@"Логгирование: сообщений на вЫходе=" + m_listQueueMessage.Count);
                            //    foreach (MESSAGE msg in m_listQueueMessage)
                            //        Console.WriteLine(@"Тип сообщения=" + msg.m_state.ToString ());
                            //}
                        }
                        else
                        {
                            ;     //Нет соединения с БД
                        }
                        break;

                    case LOG_MODE.FILE:
                        bool locking = false;
                        if ((!(m_listQueueMessage == null)) && (m_listQueueMessage.Count > 0))
                        {
                            lock (m_objQueueMessage)
                            {
                                while (m_listQueueMessage.Count > 0)
                                {
                                    if (m_listQueueMessage[0].m_bSeparator == true)
                                    {
                                        toPost += MessageSeparator + Environment.NewLine;
                                    }
                                    else
                                    {
                                        ;
                                    }

                                    if (m_listQueueMessage[0].m_bDatetimeStamp == true)
                                    {
                                        toPost += m_listQueueMessage[0].m_strDatetimeReg + Environment.NewLine;
                                        toPost += DatetimeStampSeparator + Environment.NewLine;
                                    }
                                    else
                                    {
                                        ;
                                    }

                                    toPost += m_listQueueMessage[0].m_text + Environment.NewLine;

                                    if (m_listQueueMessage.Count == 1)
                                    {
                                        locking = m_listQueueMessage[0].m_bLockFile;
                                    }
                                    else
                                    {
                                        ;
                                    }

                                    m_listQueueMessage[0].m_state = STATE_MESSAGE.RUNNING;
                                }
                            }

                            if (locking == true)
                            {
                                LogLock();
                                LogCheckRotate();
                            }
                            else
                            {
                                ;
                            }

                            if (File.Exists(m_fileName) == true)
                            {
                                try
                                {
                                    if ((m_sw == null) || (m_fi == null))
                                    {
                                        //Вариант №1
                                        //FileInfo f = new FileInfo(m_fileName);
                                        //FileStream fs = f.Open(FileMode.Append, FileAccess.Write, FileShare.Write);
                                        //m_sw = new LogStreamWriter(fs, Encoding.GetEncoding("windows-1251"));
                                        //Вариант №2
                                        m_sw = new LogStreamWriter(m_fileName, true, Encoding.GetEncoding("windows-1251"));

                                        m_fi = new FileInfo(m_fileName);
                                    }
                                    else
                                    {
                                        ;
                                    }

                                    m_sw.Write(toPost);
                                    m_sw.Flush();
                                }
                                catch (Exception e)
                                {
                                    /*m_sw.Close ();*/
                                    m_sw = null;
                                    m_fi = null;
                                }
                            }
                            else
                            {
                                ;
                            }

                            //if (externalLog == true)
                            //{
                            //    if (timeStamp == true)
                            //        delegateUpdateLogText(DateTime.Now.ToString() + ": " + message + Environment.NewLine);
                            //    else
                            //        delegateUpdateLogText(message + Environment.NewLine);
                            //}
                            //else
                            //    ;

                            lock (m_objQueueMessage) {
                                m_listQueueMessage.RemoveAt(0);
                            }

                            if (locking == true)
                            {
                                LogUnlock();
                            }
                            else
                            {
                                ;
                            }
                        }
                        else
                        {
                        }
                        break;

                    case LOG_MODE.UNKNOWN:
                    default:
                        break;
                    }
                }
                else
                {
                    ;
                }

                if (indx_semathread == INDEX_SEMATHREAD.STOP)
                {
                    break;
                }
                else
                {
                    m_arEvtThread[(int)INDEX_SEMATHREAD.MSG].Reset();
                }
            }
        }