Помогите ускорить работу с событиями!
От:
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: Помогите ускорить работу с событиями!
Здравствуйте, Deleter, Вы писали:
D>Нужно из журнала событий Безопсаность винды загружать события входа и выхода в LIstView. Но так как написал я это происходит очень медленно. Может кто поможет!
У класса ListView есть методы BeginUpdate / EndUpdate используя их можно несколько ускорить скорость вставки элементов в список.
Кроме этого можно производить вставку из паралелльного потока. скорости это правда не даст. но, интерфейс на время вставки блокироваться не будет. И как альтернатива можно взять виртуальный ListView. Его использование тоже может улучшить "откликаемость" интерфейса.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Помогите ускорить работу с событиями!
Здравствуйте, 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]: Помогите ускорить работу с событиями!
Здравствуйте, Deleter, Вы писали:
D>А если мне запускать добавление элементов в лист в отдельном потоке?
Напрямую работать с UI-элементами можно только из того потока, где они были созданы.
Re[3]: Помогите ускорить работу с событиями!
От:
squiz
Дата: 24.03.06 08:35
Оценка:
Здравствуйте, Deleter,
Завести метод и дергать его с помощью Invoke/BeginInvoke
Never underestimate those behind you...
Re[3]: Помогите ускорить работу с событиями!
Здравствуйте, Deleter, Вы писали:
D>А если мне запускать добавление элементов в лист в отдельном потоке? как правильно и лучше это реализовать?
Создай в рабочем потоке айтемы, заполни их значениями, а потом передай в основной поток и подгрузи их в контрол, используя AddRange
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить