Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# Windows Forms

Войти
Регистрация
Восстановить пароль
 
Perdywok
0 / 0 / 0
Регистрация: 16.05.2015
Сообщений: 66
#1

Программа для мониторинга состояния системных дисков - C#

07.06.2017, 19:31. Просмотров 263. Ответов 9
Метки нет (Все метки)

Доброго времени суток. Тема программы: "Разработать программное обеспечение для мониторинга состояния свободного пространства на системных дисках. При уменьшении свободного пространства до заданного значения(значение может задаваться в мегабайтах (гигабайтах) или в процентах от исходного размера диска) – происходит выдача служебного сообщения."
При выборе имени диска из comboBox1 вылазит ошибка:
System.InvalidOperationException: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'comboBox1' не из того потока, в котором он был создан."
Ошибка понятна, но как исправить не знаю, т.к в потоках/делегатах/событиях почти не разбираюсь. По сути программа готова, если убрать эту ошибку. Был бы очень рад сторонней помощи.
P.S Новый поток нужен чтоб окно формы не зависало во время цикла.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public partial class Form1 : Form
    {
        static bool boolshit = false;
        public delegate void delegat(object sender, MouseEventArgs e);
        public Form1()
        {
            InitializeComponent();
            DriveInfo[] l = DriveInfo.GetDrives();
            foreach (DriveInfo item in l)
            {
                if (item.DriveType == DriveType.Fixed)
                    comboBox1.Items.Add(item.Name);
            }
            MouseClick += btn_MouseDown;
        }
        void btn_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                MessageBox.Show("Righ tButton");
                boolshit = true;
            }
        }
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
        private void button1_Click(object sender, EventArgs e)
        {
            Thread thread2 = new Thread(Method2);
            thread2.Start();
        }
        private void Method()
        {
            if (textBox3.Text != "")
            {
                MessageBox.Show("Monitoring program is running now");
                while (boolshit == false)
                {
                    Thread.Sleep(500);
                    try
                    {
                        if (Int64.Parse(textBox2.Text) < Int64.Parse(textBox3.Text))
                        {
                            MessageBox.Show("available space on the drive less than limit");
                            break;
 
                        }
                        else
                            continue;
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Input correct value");
                    }
 
                }
            }
            else
                MessageBox.Show("At first enter the limitation");
        }
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
       private void Method2()
        {
            if (comboBox1.Text != "")    //ТУТ вылазит ошибка
                try
                {
                    while (boolshit == false)
                        Thread.Sleep(500);
                    DriveInfo Drives = new DriveInfo(comboBox1.Text);
                    textBox1.Text = Drives.TotalSize.ToString();
                    textBox2.Text = Drives.AvailableFreeSpace.ToString();
                }
                catch (Exception)
                {
                    MessageBox.Show("At first choose available driver");
                }
 
        }
 
 
        private void button2_Click(object sender, EventArgs e)
        {
            Thread thread1 = new Thread(Method);
            thread1.Start();
        }
0
Изображения
 
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2017, 19:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа для мониторинга состояния системных дисков (C#):

Меню для мониторинга состояния объектов - C#
Друзья, Товарищи!!! Здравствуйте. Никак не определюсь, подскажите-покажите:) Имеется xml файл, допустим его узлы это текущее состояние...

Программа для мониторинга использования памяти другими приложениями - C#
Есть ли какая-либо программа, которая бы выводила данные о другой программе с начала её запуска: размер занимаемый оперативной памяти,...

Служба Windows для мониторинга процессов - C#
Добрый день! Пытаюсь создать службу представляющую из себя сервер, с помощью которой можно по запросу определить запущенные приложения и...

Условие для вывода всех дисков в datagridview - C#
Помогите реализовать условие для вывода всех дисков...Выводит только последний диск Код: ObjectQuery DiskQuery = new...

Просмотреть все состояния Checked для флагов и радиокнопок на форме - C#
Добрый день! Есть List&lt;System.Windows.Forms.Control&gt; controls, который состоит из чекбоксов и радиобаттонов. Необходимо просмотреть все...

Как сделать метод для изменения состояния ячеек в поле? - C#
Описание программного средства: Игровое поле представляет собой квадрат 4х4 клетки, заполненный числами от 1 до 16. Между каждыми...

9
Perdywok
0 / 0 / 0
Регистрация: 16.05.2015
Сообщений: 66
07.06.2017, 22:27  [ТС] #2
C#
1
2
3
4
 private void button1_Click(object sender, EventArgs e)
        {
            Thread thread2 = new Thread(Method2);
            BeginInvoke(new AddMessageDelegate(Method2));
Попробовал сделать метод асинхронным(если я правильно понял), окно формы залагало.
0
Sanya_sa
Модератор
626 / 612 / 158
Регистрация: 03.02.2015
Сообщений: 3,659
Записей в блоге: 8
Завершенные тесты: 3
07.06.2017, 22:29 #3
Цитата Сообщение от Perdywok Посмотреть сообщение
попытка доступа к элементу управления 'comboBox1' не из того потока, в котором он был создан.
Например для label:

C#
1
this.Invoke(new Action(() => { labelTimerAt.Text = string.Format("{0:00} : {1:00}", min, sec); }));
1
Perdywok
0 / 0 / 0
Регистрация: 16.05.2015
Сообщений: 66
07.06.2017, 23:12  [ТС] #4
Изменил Method2 на
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        private string[] Method2()
        {
            if (comboBox1.Text != "")    //ТУТ вылазит ошибка
                try
                {
                    while (boolshit == false)
                        Thread.Sleep(500);
                    DriveInfo Drives = new DriveInfo(comboBox1.Text);
                    textBox1.Text = Drives.TotalSize.ToString();
                    textBox2.Text = Drives.AvailableFreeSpace.ToString();
                }
                catch (Exception)
                {
                    MessageBox.Show("At first choose available driver");
                }
            string[] array = { textBox1.Text,textBox2.Text};
            return array;
        }
button1_Click на
C#
1
2
3
4
5
6
7
       private void button1_Click(object sender, EventArgs e)
        {
            string[] temp = Method2();
            this.Invoke(new Action(() => {comboBox1.Items.AddRange(temp); }));
 
 
        }
Но окно формы все равно виснет((
0
Casper-SC
Эксперт .NET
3521 / 1740 / 183
Регистрация: 27.03.2010
Сообщений: 4,927
Записей в блоге: 1
07.06.2017, 23:23 #5
Скинь проект.

Добавлено через 1 минуту
С нуля свой ваять что-то неохота. Просто тут проще код написать, чем советы раздавать.
1
Perdywok
0 / 0 / 0
Регистрация: 16.05.2015
Сообщений: 66
07.06.2017, 23:29  [ТС] #6
Скинул
0
Вложения
Тип файла: zip ProgramStas.zip (66.2 Кб, 3 просмотров)
Casper-SC
Эксперт .NET
3521 / 1740 / 183
Регистрация: 27.03.2010
Сообщений: 4,927
Записей в блоге: 1
08.06.2017, 00:03 #7
Скачал, начал исправлять и понял, что нужно вообще всё по другому делать. Ты хочешь прямо в ходе работы менять лимиты, как я понял. Чтобы прям всё было тип топ. Сделай для начала максимально просто.

При запуске потока нужно проверять не запущен ли он уже. Возможно, что первое нажатие это запуск, второе нажатие это остановка работы потока (не самого потока, а в логике его работы, поток можно запускать вообще при старте программы). Когда запустил диагностику, то всё, что влияет на неё либо становится недоступным для ввода, либо никак не меняет параметры.

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

Добавлено через 1 минуту
Пытаться сделать в том ключе, что сейчас - плохая затея. Тем более сразу делать мега всемогущего монстра с заменой параметров на лету. Это можно сделать, но это усложняет задачу и отнимет больше времени.

Добавлено через 3 минуты
Давай я маленький пример лучше набросаю, что я имею ввиду, а ты уже по своему сделаешь.
1
Perdywok
0 / 0 / 0
Регистрация: 16.05.2015
Сообщений: 66
08.06.2017, 00:04  [ТС] #8
Было бы супер, спасибо)
0
Casper-SC
Эксперт .NET
3521 / 1740 / 183
Регистрация: 27.03.2010
Сообщений: 4,927
Записей в блоге: 1
08.06.2017, 02:40 #9
Perdywok,
1
Вложения
Тип файла: zip MegaDiagnotor2017Millenium.zip (24.2 Кб, 3 просмотров)
Perdywok
0 / 0 / 0
Регистрация: 16.05.2015
Сообщений: 66
08.06.2017, 02:51  [ТС] #10
Большое спасибо. Как проснусь начну доделывать по твоему исходнику)
0
08.06.2017, 02:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2017, 02:51
Привет! Вот еще темы с ответами:

Программа мониторинга состояния охранных датчиков - C++
“Разработка программного комплекса для мониторинга энергосистемы компании”. 1. Исходные данные Охранные датчики(на движение, открытие,...

Windows-приложение для мониторинга состояния SMART регистров жесткого диска - C++
Доброго времени суток дорогие ребята! Возможно кто-то уже сталкивался с такой задачей.Не составить ли вам труда помочь студенту. Буду...

WebMon-Система для мониторинга состояния Ubuntu-сервера через интернет. - Ubuntu Linux
Добрый день, я недавно написал для себя небольшую систему скриптов, позволяющую мониторить состояние Ubuntu-server по интернету, вот...

Подскажите пожалуйста, приложение с функционалом sys-activity на desktop Win 7 для мониторинга состояния IPhone - Программирование iOS
Уважаемые форумчане подскажите пожалуйста прогу как Sys-activity только на desktop под Win 7. Необходима для мониторинга состояния памяти и...


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

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

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