Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 24
1

Вывод потоков выделенного процесса

18.05.2013, 11:53. Просмотров 4488. Ответов 21
Метки нет (Все метки)

Здравствуйте.

Нужно вывести в листбокс ID потоков процесса, который будет активирован в ListView. Ниже приведен код, но программа работает не так, как хотелось бы. Подскажите, в чем проблема...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        private void proclist_ItemActivate(object sender, EventArgs e)
        {
            try
            {
                Process pp = Process.GetCurrentProcess();
                ProcessThreadCollection prt;
                prt = pp.Threads;
                ThreadsAdd(prt);
                MessageBox.Show("Hello");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
 
        private void ThreadsAdd(ProcessThreadCollection prt)
        {
            for(int nn = 0; nn<=prt.Count; nn++)
            this.listBox1.Items.Add(prt[nn].Id);
        }
Добавлено через 10 минут
Проблема еще в том, что выводит одинаковые потоки для любого процесса.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2013, 11:53
Ответы с готовыми решениями:

Id выделенного процесса в listview
Здравствуйте! Ребята, подскажите как получить ProcessID выделенного элемента в listview? В...

Запуск двух потоков и просмотр системной информации о физической и виртуальной памяти процесса
Разработать программу, в которой есть возможность запуска двух потоков и просмотр системной...

CPU выделенного процесса
Ребят, вывел процессы при нажатии на любой, записываю имя его. И пытаюсь сделать чтобы показывало...

Количество потоков процесса
Есть программа которая выводит информацию про процессы, которые используют определенное количество...

21
Почетный модератор
Эксперт .NET
8677 / 3629 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
18.05.2013, 12:21 2
Цитата Сообщение от R_D Посмотреть сообщение
Process.GetCurrentProcess();
Вы тем самым получаете информацию о текущем процессе (вашем приложении) => и выводите потоки только для него.
1
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 24
18.05.2013, 12:25  [ТС] 3
Цитата Сообщение от NickoTin Посмотреть сообщение
Вы тем самым получаете информацию о текущем процессе (вашем приложении) => и выводите потоки только для него.
Хм, а что сделать, чтоб выводились потоки для активированного двойным кликом процесса??
0
Почетный модератор
Эксперт .NET
8677 / 3629 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
18.05.2013, 12:30 4
Получить либо имя выделенного процесса, либо Id и тогда использовать GetProcessByName или GetProcessById соответственно...
1
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 24
18.05.2013, 12:49  [ТС] 5
Цитата Сообщение от NickoTin Посмотреть сообщение
Получить либо имя выделенного процесса, либо Id и тогда использовать GetProcessByName или GetProcessById соответственно...
Спасибо. Возникает тогда вопрос... Как получить ID процесса? Ниже код, но требуется значение pft.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private void proclist_ItemActivate(object sender, EventArgs e)
        {
            try
            {
                Process pft;
                int ppid = pft.Id;
                Process pp = Process.GetProcessById(ppid);
                ProcessThreadCollection prt;
                prt = pp.Threads;
                ThreadsAdd(prt);
                MessageBox.Show("Hello");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
0
Почетный модератор
Эксперт .NET
8677 / 3629 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
18.05.2013, 13:10 6
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        public Form1()
        {
            InitializeComponent();
            listView1.ItemSelectionChanged += listView1_ItemSelectionChanged;
        }
 
        void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
        {
            listView2.Items.Clear();
            ((Process)e.Item.Tag).Refresh();
            foreach (ProcessThread th in ((Process)e.Item.Tag).Threads)
                listView2.Items.Add(new ListViewItem(th.Id.ToString()));
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            foreach (var proc in Process.GetProcesses())
            {
                listView1.Items.Add(new ListViewItem(proc.ProcessName) { Tag = proc });
            }
        }
1
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 24
18.05.2013, 13:50  [ТС] 7
Спасибо большое! Но мне надо вывести ID потоков в listBox. Также метод Item не найден. Подскажите, что делать?
0
Почетный модератор
Эксперт .NET
8677 / 3629 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
18.05.2013, 13:55 8
Проект прикрепите в тему
Цитата Сообщение от R_D Посмотреть сообщение
Также метод Item не найден
иначе не понятно почему не найден...
1
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 24
18.05.2013, 14:02  [ТС] 9
prob1.rar

Программа должна:
1. Выводить все процессы и обновлять каждые 0,5 сек. (Еще не доработано)
2. Выводить в Листбокс список потоков выбранного процесса.

Написана на VS2010.
0
Почетный модератор
Эксперт .NET
8677 / 3629 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
18.05.2013, 14:15 10
R_D, почему Вы подписываетесь на событие ItemActivate, когда я приводил для ItemSelectionChanged? От того и ошибка.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
            proclist.ItemSelectionChanged += proclist_ItemSelectionChanged;
 
        // ... 
 
        //Активация процесса двойным кликом для вывода потока
        private void proclist_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
        {
            try
            {
                listBox1.Items.Clear();
                foreach (ProcessThread th in Process.GetProcessesByName(e.Item.Text)[0].Threads)
                    listBox1.Items.Add(th.Id.ToString());
 
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Да еще и 2 раза на событие ItemActivate подписываетесь, один раз через дизайнер, второй раз через конструктор класса Form1...
1
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 24
18.05.2013, 14:21  [ТС] 11
Спасибо большое! Все исправлено.
0
Почетный модератор
Эксперт .NET
8677 / 3629 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
18.05.2013, 14:22 12
Цитата Сообщение от NickoTin Посмотреть сообщение
Process.GetProcessesByName(e.Item.Text)[0].Threads
Вот тут будет проблема если запущено два процесса с одним именем, подумайте над решением
1
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 24
18.05.2013, 14:30  [ТС] 13
Окей, все изучим! А еще... Можно как-нибудь свойства потока смотреть после вывода??
0
Почетный модератор
Эксперт .NET
8677 / 3629 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
18.05.2013, 14:43 14
Цитата Сообщение от R_D Посмотреть сообщение
Можно как-нибудь свойства потока смотреть после вывода??
Конечно можно, если сохранить где-нибудь ссылку на ProcessThread, как я это делал с Process (сохранял полученный экземпляр Process в свойстве Tag ListViewItem'а и при выборе элемента в ListView работал с этим свойством).

Т.к. ListBox не имеет какого-то специфичного класса для хранения элементов (хранит элементы как object, а ListView, например, как ListViewItem), то и свойства Tag по умолчанию у его элементов нет, тогда нужно писать собственный класс который будет выступать в роли элемента, и в нём уже хранить всю нужную информацию. Пример такой реализации есть здесь.
Ну или просто в замен ListBox использовать ListView и тогда будет Tag, как больше нравится.
1
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 24
18.05.2013, 14:52  [ТС] 15
Так, как я понял, отдельный класс для Tag вот:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        class LIST_TAG_EX
        {
            public string Name { get; private set; }
 
            public Color Color { get; set; }
 
            public LIST_TAG_EX ( string Name, Color Color ) {
                this.Name = Name; this.Color = Color;
            }
 
            public override string ToString () {
                return this.Name;
            }
        }
Но как тогда мне вывести свойства потока, скажем, в MessageBox при двойном клике элемента в listbox?
0
Почетный модератор
Эксперт .NET
8677 / 3629 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
18.05.2013, 15:01 16
Цитата Сообщение от R_D Посмотреть сообщение
отдельный класс для Tag вот
Да.
Цитата Сообщение от R_D Посмотреть сообщение
MessageBox при двойном клике элемента в listbox
На примере этого класса:
C#
1
2
3
4
5
6
        private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            var tag = listBox1.SelectedItem as LIST_TAG_EX;
 
            MessageBox.Show(tag.Color.ToString());
        }
1
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 24
18.05.2013, 15:16  [ТС] 17
Переделал класс:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        class LIST_TAG_EX  //класс для хранения в listBox1
        {
            public ProcessThread pthr { get; set; }
 
            public LIST_TAG_EX(ProcessThread pthr)
            {
                this.pthr = pthr;
            }
 
            /*public override string ToString()
            {
                return this.Name;
            }*/
        }
Также сделал вывод:
C#
1
2
3
4
5
6
 private void listBox1_MouseDoubleClick_1(object sender, MouseEventArgs e)
        {
            var tag = listBox1.SelectedItem as LIST_TAG_EX;
 
            MessageBox.Show(tag.pthr.ToString());
        }
Выходит исключение, что ссылка на объект не указывает на экземпляр объекта. В чем прокол?
0
Почетный модератор
Эксперт .NET
8677 / 3629 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
18.05.2013, 15:34 18
Как добавляете элементы в ListBox?
1
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 24
18.05.2013, 15:41  [ТС] 19
Цитата Сообщение от NickoTin Посмотреть сообщение
Как добавляете элементы в ListBox?
Как вы мне показали:
C#
1
2
                foreach (ProcessThread th in Process.GetProcessesByName(e.Item.Text)[0].Threads)
                    listBox1.Items.Add(th.Id.ToString());
0
Почетный модератор
Эксперт .NET
8677 / 3629 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
18.05.2013, 16:12 20
R_D, неужто никаких мыслей не возникает почему так? Пересмотрите пример того как этот класс используется, по ссылке выше.

Кликните здесь для просмотра всего текста
C#
1
listBox1.Items.Add(new LIST_TAG_EX(th));
Чтобы вывод в ListBox был нормальным, а не имя класса, нужно переопределить метод ToString у LIST_TAG_EX (пример, опять же по ссылке).
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.05.2013, 16:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Распознавание потоков процесса
Здраствуйте, такой вопрос появился. Чтобы защитить процесс от всяких инжекторов, нужно сделать...

По ID процесса узнать количество потоков
Пытаюсь по ID процесса узнать количество потоков public int GetCountThread(int processId) ...

Число потоков процесса и их приоритет
Здравствуйте. Мне дали задание в windows forms вывести в таблицу список процессов с отображением...

Копирование выделенного текста в HTML странице ссылкой и id значением первого выделенного абзаца
В общем так: На странице имеется длинный текст со множеством абзацами заключённые в &lt;p&gt; теги,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.