То, что я пытаюсь выполнить в своей программе, - это знать, работают ли определенные процессы (мне нужно знать обо всех запущенных экземплярах). Я хочу держать их в combobox, хранить как объект, поэтому я могу отбросить их позже. Я думал, что это будет легко, но, как выяснилось, это вызвало у меня головную боль: P Я не уверен, что так оно и должно быть сделано, но оно работает. Тем не менее, мне плохо в этом решении. Я не знаю хороших шаблонов программирования для этого, поэтому я прошу вас, коллеги-кодеры, помочь мне.Операции процесса (мониторинг)
Первое, что пришло мне в голову, - использовать таймер для проверки процессов и добавить их, а также использовать событие «Выход», чтобы удалить их из моего списка. Так вот мой код на Tick событие таймера:
private void timer_ProcessCheck_Tick(object sender, EventArgs e)
{
Process[] tmpArray = Wow_getCurrentlyRunning(); // this returns Process[]
if (comboBox_processes.Items.Count == 0)
{
if (tmpArray.Count() > 0)
for (int Index = 0; Index < tmpArray.Count(); Index++)
Add(tmpArray[Index]); // adding to combobox
}
else
{
if (tmpArray.Count() > comboBox_processes.Items.Count)
{
List<Process> result;
/*Diff compares the two array, and returns to result variable.*/
if (Diff(tmpArray, comboBox_processes, out result))
foreach(Process proc in result)
Add(proc); // adding to combobox
}
}
}
И мой метод Diff выглядит так, что поставит разницу дифф переменной.
public bool Wow_differsFrom(Process[] current, ComboBox local, out List<Process> diff)
{
List<int> diffIndex = new List<int>();
foreach (Process proc in current)
diffIndex.Add(proc.Id);
for (byte Índex = 0; Índex < current.Count(); Índex++)
{
for (byte Index = 0; Index < local.Items.Count; Index++)
{
if (current[Índex].Id == (local.Items[Index] as Process).Id)
{
diffIndex.Remove(current[Índex].Id);
break;
}
}
}
diff = new List<Process>();
for (int x = 0; x < current.Count(); x++)
for (int i = 0; i < diffIndex.Count; i++)
if (current[x].Id == diffIndex[i])
diff.Add(current[x]);
if (diff.Count == 0)
return false;
return true;
}
Вот обработчик события возбужденном дозвонились на платформе завершения процесса
private void Wow_exitedEvent(object o, EventArgs e)
{
RemoveCBItem(comboBox_processes, (o as Process).Id); // this will remove the process from combobox, also threadsafe.
}
Мои вопросы:
Как бы вы это сделали? Подхожу ли я к этому правилу? У меня такое чувство, я не знаю.
Есть ли какие-либо события для подачи заявки? Как и один для выхода . Может быть, глубоко в Win32 API?
У меня возникло чувство об этом, что вы сказали о Win API = ( У меня есть эта странная привычка хранить мои объекты в собственности владельца элемента управления, когда я могу, разве это не так эффективно? Или это другое Кстати, по методу Count() - да, спасибо за напоминание :) Я полностью забыл об этом. Что касается предложения привязки данных, я попытался с этим при первом подходе, и я решил не использовать его из-за мигания. Что вы подразумеваете под кодом coll.synch? Мой метод Diff? –
На самом деле, да, метод синхронизации - это ваш метод Diff. Но он может быть реализован гораздо более ясным и простым. Извините, но у меня нет времени, чтобы написать его сейчас = (. Общая идея: сортировать обе коллекции, искать каждый элемент первой коллекции во втором. Если не найдено - удалить элемент из первой коллекции. 1: если не найдено - добавьте его. –
И что с моим подходом для загрузки данных в combobox не по таймеру.Только, но на combobox_Expand? Не уместно? –