powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Алгоритмы (массивы)
20 сообщений из 20, страница 1 из 1
Алгоритмы (массивы)
    #39586984
Nat1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день форумчанам!

Пишу утилитку для работы и обучения на живом примере. Вроде все правильно, но почему то не корректно работает. Через debug уже каждую переменную просмотрела.... нашла где загвоздка, но не понимаю почему она там. Посоветовали обратиться сюда за помощью.

Мне нужно фиксировать какие программы пользователь запускает, какие выключает, вот что получилось:


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
//глобально определила переменные
      //первые / предыдущие процессы
        string[] FirstCheckedProseses = new string[200];
        //текущие процессы
        string[] NowCheckedProseses = new string[200];


///получить текущие процессы
        private  void GetCurrentProcess()
        {
            string username = GetCurrentUserName();          
            int Cnt = 0;


            //если массив с первичными процессами пустой - заполним его
            if (FirstCheckedProseses[0] == null)
            {

                foreach (Process procesInfo in Process.GetProcesses())
                {
                    if (GetProcessOwner(procesInfo.Id) == username)
                    {
                        FirstCheckedProseses[Cnt] = (procesInfo.ProcessName.ToString() + Environment.NewLine);

                        //запишем старт всех процессов...

                        Cnt++;
                    }
                }

                

            }//конец первичное заполнение



            //если проверка уже была
            else
            {
                foreach (Process procesInfo in Process.GetProcesses())
                {
                    if (GetProcessOwner(procesInfo.Id) == username)
                    {
                        NowCheckedProseses[Cnt] = (procesInfo.ProcessName.ToString() + Environment.NewLine);
                        Cnt++;
                    }
                }

                //имеем предыдущие процессы и текущие, сравним (исключение) и определим какой процесс добавился, какой убавился
                string[] NewStartedAPP = NowCheckedProseses.Except<string>(FirstCheckedProseses).ToArray<string>();
                string[] ClosedAPP = FirstCheckedProseses.Except<string>(NowCheckedProseses).ToArray<string>();

                textBoxClosed.Lines = ClosedAPP;
                textBoxStart.Lines = NewStartedAPP;

                //обновим предыдущую проверку текущими процессами
                FirstCheckedProseses = NowCheckedProseses;

            } //конец если проверка уже была

 

        }



1) запускаю первый раз проверку - все ок, получаю все процессы
2) открываю например ексель, нажимаю проверку - в списке добавившихся приложений появляется ексель - все ок
3) закрываю ексель или делаю любые манипуляции - оба массива ClosedAPP NewStartedAPP пустые....

Проверяла дебагером... при второй проверке - //обновим предыдущую проверку текущими процессами
FirstCheckedProseses = NowCheckedProseses;

FirstCheckedProseses - не содержит екселя..... Где же ошибка?

Спасибо
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39587022
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Nat1990оба массива ClosedAPP NewStartedAPP пустые....
Потому что Вы их локально определили.
Вообще-то тут все неправильно.
Например, вместо массивов надо использовать List<Process>

Nat1990
Код: c#
1.
NowCheckedProseses[Cnt] = (procesInfo.ProcessName.ToString() + Environment.NewLine);


Зачем перевод строки? Пользователь может запустить несколько процессов с одинаковыми названиями.
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39587045
Nat1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2Nat1990оба массива ClosedAPP NewStartedAPP пустые....
Потому что Вы их локально определили.
Вообще-то тут все неправильно.
Например, вместо массивов надо использовать List<Process>

Nat1990
Код: c#
1.
NowCheckedProseses[Cnt] = (procesInfo.ProcessName.ToString() + Environment.NewLine);


Зачем перевод строки? Пользователь может запустить несколько процессов с одинаковыми названиями.

Спасибо за помощь.

Я конечно совсем новичок, но показалось лист больше подходит:

--
Я сделал некоторые тесты. Думаю, многим будет интересно посмотреть на результаты. Исходники тестов по линке: https://github.com/ukushu/DataStructuresTests.git

Короткие выводы:

Array нужно использовать:

Максимально часто, если это возможно (быстродействие и оптимальность памяти)
Если не нужно добавлять ячейки
Если ожидаемый вес < 85000b
Если нужна Random Access Speed
List нужно использовать:

Если нужно добавлять ячейки в конец списка (в большом/малом количестве)
Если нужно добавлять ячейки в начало/середину списка (в малом количестве)
Если ожидаемый вес < 85000b
Если нужна Random Access Speed
Предпочтительно инициализировать с уже набранным количеством элементов, если это возможно.
источник https://ru.stackoverflow.com/questions/639301/c-list-vs-linkedlist-vs-array
--

Да, перевод лишний, осталось от экспериментов.
Про одинаковые названия не подумала (
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39587072
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
List<T> это просто обёртка над массивом с возможность добавлять, удалять и т.д.
сравнивать их глупо, требуются для разных задач.
Где звездочки в коде, я не понял
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39587073
Nat1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Cat2]Nat1990оба массива ClosedAPP NewStartedAPP пустые....
Потому что Вы их локально определили.
/quot]


так они и не должны быть глобальными.... они локально в функции используются... глобальные эти - NowCheckedProseses и FirstCheckedProseses
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39587077
Nat1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman MejtesList<T> это просто обёртка над массивом с возможность добавлять, удалять и т.д.
сравнивать их глупо, требуются для разных задач.
Где звездочки в коде, я не понял

какие звездочки?
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39587118
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{


    public class ProcessWatcher
    {

        public struct ProcessEntry
        {
            public string Name;
            public int Id;
            public override string ToString()
            {
                return $"ProcessEntry. Name={Name}, Id={Id}";
            }
        }

        private IEnumerable<ProcessEntry> _oldProcesses = Enumerable.Empty<ProcessEntry>();

        public void Check()
        {
            IEnumerable<ProcessEntry> currentProcesses;
            //Получаем текущие процессы
            try
            {
                currentProcesses = Process.GetProcesses()
                    .Select(p => new ProcessEntry { Name = p.ProcessName, Id = p.Id }).ToArray();
            }
            catch (Exception ex)
            {
                return;
            }
            //Проверяем каких стало больше, а каких меньше
            var removed = _oldProcesses.Except(currentProcesses).ToArray();
            var added = currentProcesses.Except(_oldProcesses).ToArray();
            foreach (var i in added) Console.WriteLine("ADD:" + i);
            foreach (var i in removed) Console.WriteLine("DEL:" + i);
            _oldProcesses = currentProcesses;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var watcher = new ProcessWatcher();
            while (true)
            {
                watcher.Check();
                Task.Delay(1000).Wait();
            }
        }


    }
}


В чем проблема?
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39587172
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nat1990Cat2пропущено...

Потому что Вы их локально определили.
Вообще-то тут все неправильно.
Например, вместо массивов надо использовать List<Process>

пропущено...

Зачем перевод строки? Пользователь может запустить несколько процессов с одинаковыми названиями.

Спасибо за помощь.

Я конечно совсем новичок, но показалось лист больше подходит:

--
Я сделал некоторые тесты. Думаю, многим будет интересно посмотреть на результаты. Исходники тестов по линке: https://github.com/ukushu/DataStructuresTests.git

Короткие выводы:

Array нужно использовать:

Максимально часто, если это возможно (быстродействие и оптимальность памяти)
Если не нужно добавлять ячейки
Если ожидаемый вес < 85000b
Если нужна Random Access Speed
List нужно использовать:

Если нужно добавлять ячейки в конец списка (в большом/малом количестве)
Если нужно добавлять ячейки в начало/середину списка (в малом количестве)
Если ожидаемый вес < 85000b
Если нужна Random Access Speed
Предпочтительно инициализировать с уже набранным количеством элементов, если это возможно.
источник https://ru.stackoverflow.com/questions/639301/c-list-vs-linkedlist-vs-array
--

Да, перевод лишний, осталось от экспериментов.
Про одинаковые названия не подумала (


вас научили плохому
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39587386
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Nat1990Если не нужно добавлять ячейки
Яички
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39587391
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Nat1990Короткие выводы:

Array нужно использовать:

Максимально часто, если это возможно (быстродействие и оптимальность памяти)
Если не нужно добавлять ячейки
Если ожидаемый вес < 85000b
Если нужна Random Access Speed
List нужно использовать:
Как много выводов из одной и причем неправильно решенной задачи!
Примерно так решается, если не важно , что каждый пользователь может запустить несколько процессов с одинаковыми именами

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
using System;
using System.Diagnostics;
using System.Linq;

namespace ConsoleApplication3
{
    class Program
    {
        static bool getOwner(Process p) {
            //это заглушка, иммитирующая получение владельца процесса
            return Environment.UserName == Environment.UserName;
        }
        static void Main(string[] args)
        {
            int k = 0;
            var ps = Process.GetProcesses().Where(p => getOwner(p)).Select(p => p.ProcessName).ToList();
            Console.WriteLine("Запущенные процессы");
            ps.ForEach(p=>Console.WriteLine(p));
            BEGIN:
            Console.WriteLine("++++++++++++++");
            Console.WriteLine(string.Format("Итерация {0}",  k++));
            var psn = Process.GetProcesses().Where(p => getOwner(p)).Select(p => p.ProcessName).ToList();
            Console.WriteLine("Закрытые");
            ps.Except(psn).ToList().ForEach(p => Console.WriteLine(p));
            Console.WriteLine("Открытые");
            psn.Except(ps).ToList().ForEach(p => Console.WriteLine(p));
            Console.WriteLine("Откройте или закройте процесс и нажмите \"Enter\"");
            Console.ReadLine();
            ps = psn;
            goto BEGIN;

        }

    }
}
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39587394
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Нет! На это пойтить я не могу!

Как всякий программист я являюсь перфекционистом
и поэтому я не могу сравнивать процессы по имени!
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

namespace ConsoleApplication3
{
    class Program
    {
        class ProcessComparer : IEqualityComparer<Process>
        {
            public bool Equals(Process x, Process y)
            {
                return x.Id == y.Id;
            }

            public int GetHashCode(Process process)
            {
                return process.Id;
            }

        }
        static bool getOwner(Process p) {
            //это заглушка, иммитируящая получение владельца процесса
            return Environment.UserName == Environment.UserName;
        }
        static void Main(string[] args)
        {
            int k = 0;
            var ps = Process.GetProcesses().Where(p => getOwner(p)).ToList();
            Console.WriteLine("Запущенные процессы");
            ps.ForEach(p=>Console.WriteLine(p.ProcessName));
            BEGIN:
            Console.WriteLine("++++++++++++++");
            Console.WriteLine(string.Format("Итерация {0}",  k++));
            var psn = Process.GetProcesses().Where(p => getOwner(p)).ToList();
            Console.WriteLine("Закрытые");
            ps.Except(psn, new ProcessComparer()).ToList().ForEach(p => Console.WriteLine(p.ProcessName));
            Console.WriteLine("Открытые");
            psn.Except(ps, new ProcessComparer()).ToList().ForEach(p => Console.WriteLine(p.ProcessName));
            Console.WriteLine("++++++++++++++");
            Console.WriteLine("Откройте или закройте процесс и нажмите \"Enter\"");
            Console.ReadLine();
            ps = psn;
            goto BEGIN;

        }

    }
}
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39587395
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Cat2
Код: c#
1.
иммитируящая 



иммитирующая
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39587405
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Примерно так решается
Решается это с помощью WMI events. А всё вышеприведенное - баловство. Process.GetProcesses() - достаточно тяжелая операция. Я уже натыкался, что запущенная под админом на терминальном сервере, она запросто может отрабатывать секунд 10-20.
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39587439
Pu4koff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nat1990, перепроверяйте метод GetProcessOwner. Убрал эту проверку, заменил массивы на List, чтобы не ограничиваться 200 процессами и всё нормально отработало. У новые и закрытые процессы попадают в соответствующие списки.
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39587460
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Сон Веры Павловны,

Видал я и WMI, который минутами такой список создавал.
Я уже лет 5 занимаюсь удаленной диагностикой и пришел к выводу, что если есть возможность не использовать WMI - не используй!
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39588018
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Видал я и WMI, который минутами такой список создавал.
В данном случае не нужно создавать никаких списков, нужно слушать события создания процессов.
Cat2Я уже лет 5 занимаюсь удаленной диагностикой и пришел к выводу, что если есть возможность не использовать WMI - не используй!
Есть вариант, как подписаться на событие создания процесса без WMI?
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39588117
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Nat1990Если не нужно добавлять ячейки
Яички

я и чки
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39588259
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Cat2Cat2
Код: c#
1.
иммитируящая 




иммитирующаяесли уж поправляешь, сверься с орфографическим словарем >:-|
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39588299
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nat1990
Код: c#
1.
2.
                //обновим предыдущую проверку текущими процессами
                FirstCheckedProseses = NowCheckedProseses;


FirstCheckedProseses - не содержит екселя..... Где же ошибка?
Спасибо
Здесь.
Пожалуйста.
...
Рейтинг: 0 / 0
Алгоритмы (массивы)
    #39588592
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Сон Веры ПавловныЕсть вариант, как подписаться на событие создания процесса без WMI?
Не знаю. Если есть, то лучше использовать его
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Алгоритмы (массивы)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]