Помогите ускорить работу с событиями!
От: Deleter  
Дата: 21.03.06 05:26
Оценка:
Нужно из журнала событий Безопсаность винды загружать события входа и выхода в LIstView. Но так как написал я это происходит очень медленно. Может кто поможет!
Я это сделал так:
/// <summary>
        /// Поиск сообщения выхода пользователя
        /// </summary>
        /// <param name="index">Номер события</param>
        /// <param name="user">Имя пользователя</param>
        /// <returns></returns>
        private string findLogOut(int index, string user)
        {
            EventLog evLog = new EventLog("Security");
            EventLogEntryCollection evLogCol = evLog.Entries;
            
            string[] userSpl;

            int numEnt = evLogCol.Count;
            for(int i = 0; i < numEnt; i++)
            {
                if(evLogCol[i].UserName != "")
                {
                    if(evLogCol[i].UserName != null)
                    {
                        userSpl = evLogCol[i].UserName.Split('\\');
                        if(userSpl[1] == user)
                        {
                            if(evLogCol[i].EventID == 551 & evLogCol[i].Index > index)
                            {
                                return evLogCol[i].TimeGenerated.ToLongTimeString()+'|'+evLogCol[i].TimeGenerated.ToShortDateString();
                            }
                        }
                    }
                }
                else
                {
                }
                
            }
            return "error|error";
        }
        /// <summary>
        /// Заполнение по дате
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        private void fillByDate(string start, string end)
        {
            lv_events.Items.Clear();

            EventLog evLog = new EventLog("Security");
            EventLogEntryCollection evLogCol = evLog.Entries;
            string logOut = "";
            string[] user, outTime;
            int curItem = 0;
            DateTime dtSt = Convert.ToDateTime(start);
            DateTime dtEnd = Convert.ToDateTime(end);


            int numEnt = evLogCol.Count;
            for(int i = 0; i < numEnt; i++)
            {
                if(DateTime.Compare(dtSt,evLogCol[i].TimeGenerated.Date) >= 0)
                {
                    if(DateTime.Compare(dtEnd, evLogCol[i].TimeGenerated.Date) <= 0)
                    {
                        if(evLogCol[i].EventID == 528)
                        {
                            lv_events.Items.Add(evLogCol[i].TimeGenerated.ToLongTimeString());
                            curItem = lv_events.Items.Count - 1;
                            lv_events.Items[curItem].SubItems.Add(evLogCol[i].TimeGenerated.ToShortDateString());
                    
                            user = evLogCol[i].UserName.Split('\\');
                            logOut = findLogOut(evLogCol[i].Index, user[1]);
                            outTime = logOut.Split('|');

                            lv_events.Items[curItem].SubItems.Add(outTime[0].ToString());
                            lv_events.Items[curItem].SubItems.Add(outTime[1].ToString());
                            lv_events.Items[curItem].SubItems.Add(user[1]);
                            lv_events.Items[curItem].SubItems.Add(user[0]);
                        }
                    }
                }
            }
        }
            ///ТУт ListView заполняем всеми событиями!
        private void fillAll()
        {
            EventLog evLog = new EventLog("Security");
            EventLogEntryCollection evLogCol = evLog.Entries;
            string logOut = "";
            string[] user = new string[2];
            string[] outTime = new string[2]; 
            int curItem = 0;

            int numEnt = evLogCol.Count;
            for(int i = 0; i < numEnt; i++)
            {
                if(evLogCol[i].EventID == 528)
                {
                    lv_events.Items.Add(evLogCol[i].TimeGenerated.ToLongTimeString());
                    curItem = lv_events.Items.Count - 1;
                    lv_events.Items[curItem].SubItems.Add(evLogCol[i].TimeGenerated.ToShortDateString());
                    
                    if(evLogCol[i].UserName != "")
                    {
                        if(evLogCol[i].UserName != null)
                        {
                            user = evLogCol[i].UserName.Split('\\');
                            logOut = findLogOut(evLogCol[i].Index, user[1]);
                            outTime = logOut.Split('|');
                        }
                    }
                    else
                    {
                        outTime[0] = "error";
                        outTime[1] = "error";
                        user[0] = "NULL";
                        user[1] = "NULL";
                    }
                    

                    lv_events.Items[curItem].SubItems.Add(outTime[0].ToString());
                    lv_events.Items[curItem].SubItems.Add(outTime[1].ToString());
                    lv_events.Items[curItem].SubItems.Add(user[1]);
                    lv_events.Items[curItem].SubItems.Add(user[0]);
                }
            }
        }



21.03.06 10:45: Перенесено модератором из '.NET' — TK
Re: Помогите ускорить работу с событиями!
От: TK Лес кывт.рф
Дата: 21.03.06 05:32
Оценка:
Здравствуйте, Deleter, Вы писали:

D>Нужно из журнала событий Безопсаность винды загружать события входа и выхода в LIstView. Но так как написал я это происходит очень медленно. Может кто поможет!


У класса ListView есть методы BeginUpdate / EndUpdate используя их можно несколько ускорить скорость вставки элементов в список.

Кроме этого можно производить вставку из паралелльного потока. скорости это правда не даст. но, интерфейс на время вставки блокироваться не будет. И как альтернатива можно взять виртуальный ListView. Его использование тоже может улучшить "откликаемость" интерфейса.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Помогите ускорить работу с событиями!
От: Mab Россия http://shade.msu.ru/~mab
Дата: 21.03.06 05:34
Оценка:
Здравствуйте, Deleter, Вы писали:

Честно говоря, код внимательно не читал, но вызовы Control.BeginUpdate/EndUpdate никому еще не мешали
Re: Помогите ускорить работу с событиями!
От: squiz  
Дата: 21.03.06 11:51
Оценка:
Здравствуйте, Deleter,

Ну и ко всему сказанному пользуйте AddRange() вместо Add()

и вместо

lv_events.Items[curItem].SubItems.Add(outTime[0].ToString());
lv_events.Items[curItem].SubItems.Add(outTime[1].ToString());
lv_events.Items[curItem].SubItems.Add(user[1]);
lv_events.Items[curItem].SubItems.Add(user[0]);


можно пользовать конструктор с параметром new string[] { все, елементы, здесь }
Never underestimate those behind you...
Re[2]: Помогите ускорить работу с событиями!
От: Deleter  
Дата: 22.03.06 20:02
Оценка:
А если мне запускать добавление элементов в лист в отдельном потоке? как правильно и лучше это реализовать?
Re[3]: Помогите ускорить работу с событиями!
От: Mab Россия http://shade.msu.ru/~mab
Дата: 22.03.06 20:17
Оценка:
Здравствуйте, Deleter, Вы писали:

D>А если мне запускать добавление элементов в лист в отдельном потоке?

Напрямую работать с UI-элементами можно только из того потока, где они были созданы.
Re[3]: Помогите ускорить работу с событиями!
От: squiz  
Дата: 24.03.06 08:35
Оценка:
Здравствуйте, Deleter,

Завести метод и дергать его с помощью Invoke/BeginInvoke
Never underestimate those behind you...
Re[3]: Помогите ускорить работу с событиями!
От: IDecember Россия  
Дата: 24.03.06 09:37
Оценка:
Здравствуйте, Deleter, Вы писали:

D>А если мне запускать добавление элементов в лист в отдельном потоке? как правильно и лучше это реализовать?


Создай в рабочем потоке айтемы, заполни их значениями, а потом передай в основной поток и подгрузи их в контрол, используя AddRange
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.