4 / 4 / 4
Регистрация: 29.11.2014
Сообщений: 131

Работа с потоками

22.11.2016, 21:24. Показов 1230. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Объясните мне мои ошибки и как их поправить(грузит ЦП и делает невозможным работу с GUI программы - лагает ужасно)
Есть некий класс, в котором происходит работа с потоками - выдержку я представлю ниже. Запускается он из основного потока, вызовом метода CreateThread.
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
        private Thread[] Threads;
        public void CreateThread()
        {
            try
            {
                Threads = new Thread[101];
                for (int i = 0; i < 100; i++)
                {
                    Threads[i] = new Thread(this.Worker);
                    Threads[i].IsBackground = true;
                    Threads[i].Start();
                }
 
            }
            catch (Exception)
            {
            }
        }
 
        public void StopThreads()
        {
            try
            {
                for (int i = 0; i < 100; i++)
                {
                    Threads[i].Abort();
                }
            }
            catch (Exception)
            {
            }
        }
 
        public int AliveThreads()
        {
            try
            {
                int count = 0;
                for (int i = 0; i < 100; i++)
                {
                    if (Threads[i].IsAlive)
                    {
                        count++;
                    }
                }
                return count;
            }
            catch
            {
                return 0;
            }
 
        }
 
        void Worker()
        {
            while (SomeQueue1.Count != 0)
            {
                
                if (SomeQueue1.Count + 1 < AliveThreads() && SomeQueue2.Count+1 < AliveThreads())
                {
                    break;
                }
                string data = SomeQueue1.Dequeue();
                try
                {
                    Check(data);
                }
                catch (Exception)
                {
                  SomeQueue.Enqueue(data);
                }
                if (SomeQueue2.Count != 0)
                {
                    string datae = SomeQueue2.Dequeue();
                    try
                    {
                            Check2(datae);
                    }
                    catch (Exception)
                    {
                        SomeQueue2.Enqueue(datae);
                    }
                }
            }
Возможно, моя ошибка в методе обновления GUI. Как вы понимаете,после выполнения Check и Check2 появляются какие-то новые данные, которые я вношу в GUI через таймер, который запускается в самом начале с интервалом в 1000 мс(не из потока же его обноволять, ну). Но что-то я сомневаюсь, что моя проблема в таймере. Скорее всего, я просто неправильно работаю с потоками.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2016, 21:24
Ответы с готовыми решениями:

Работа с потоками
В буфере имеется N записей типа Type. К этим записям на чтение и на запись обращаются m потоков. Каждый из потоков может изменить...

Работа с потоками!
Ребята, никогда раньше с потоками не работал... Вот помогите решить проблему Есть метод DrawClicked(bubbleSort, (Button)sender,...

Работа с потоками
Помогите начинающему программисту!!! Нужно написать программу в которой есть два дочерних потока. В главном потоке интовой переменной...

6
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
22.11.2016, 21:50
Этот код содержит ошибки. Одна из них:
C#
1
2
3
4
                if (SomeQueue2.Count != 0)
                {
                    // здесь нет никаких гарантий, что SomeQueue2 содержит хоть 1 элемент
                    string datae = SomeQueue2.Dequeue();
Насчёт лагов. Они могут быть из-за того, что процессор полностью загружен работой.
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
22.11.2016, 21:56
Цитата Сообщение от allCrowley Посмотреть сообщение
моя ошибка
1. Создаешь 101 поток, но используешь 100. И вообще так много потоков создавать неэффективно. Использовать Thread тоже не эффективно.
2. Производительность просаживается скорее всего из-за try-catch. Писать пустой catch - очень плохая практика.
3. GUI надо обновлять не через таймер, а через методы диспетчера Invoke/BeginInvoke.
4. Потоки работают с общими ресурсами: SomeQueue и SomeQueue2. Необходимо использовать синхронизацию потоков.

Добавлено через 3 минуты
Критической секции для синхронизации потоков должно хватить: используй Monitor, а потом почитай про “стройную” синхронизацию.
1
4 / 4 / 4
Регистрация: 29.11.2014
Сообщений: 131
22.11.2016, 22:41  [ТС]
Цитата Сообщение от I2um1 Посмотреть сообщение
Использовать Thread тоже не эффективно.
Если использовать Thread неэффективно, то как еще мне за 5 секунд отправить в сеть 100 запросов и обработать их?
Цитата Сообщение от I2um1 Посмотреть сообщение
2. Производительность просаживается скорее всего из-за try-catch. Писать пустой catch - очень плохая практика.
В некоторых участках кода мне нужно, чтобы ошибки(которые приводят к завершению работы программы) не возникали(иногда они возникают рандомно - на одной и той же операции, с одними и теми же входными данными). Сделать это проще, чем через конструкцию try catch где catch пустой - я не знаю.
Цитата Сообщение от I2um1 Посмотреть сообщение
GUI надо обновлять не через таймер, а через методы диспетчера Invoke/BeginInvoke.
Поправлю, спасибо!
Цитата Сообщение от I2um1 Посмотреть сообщение
Потоки работают с общими ресурсами: SomeQueue и SomeQueue2. Необходимо использовать синхронизацию потоков.
Для чего? Как я понимаю, синхронизировать потоки нужно чтобы не возникало путаницы. Но ее и так не возникает - единственная проблема, это лагающий интерфейс даже на 3-4 потоках.

Добавлено через 3 минуты
Цитата Сообщение от TopLayer Посмотреть сообщение
C#
1
2
3
4
if (SomeQueue2.Count != 0)
* * * * * * * * {
* * * * * * * * * * // здесь нет никаких гарантий, что SomeQueue2 содержит хоть 1 элемент
* * * * * * * * * * string datae = SomeQueue2.Dequeue();
Почему гарантий нету? Я же условием проверил - если очередь не пустая, то следующий элемент очереди помещаем в datae.
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
22.11.2016, 22:54
Цитата Сообщение от allCrowley Посмотреть сообщение
Если использовать Thread неэффективно, то как еще мне за 5 секунд отправить в сеть 100 запросов и обработать их?
Потоков лучше создавать столько, сколько на компьютере существует физических потоков у процессора. Вместо Thread лучше использовать Task.

Цитата Сообщение от allCrowley Посмотреть сообщение
в сеть 100 запросов
Дефолтное количество соединений 2 (ДВА). Здесь есть кое-какое объяснение https://blogs.msdn.microsoft.c... tionlimit/

Цитата Сообщение от allCrowley Посмотреть сообщение
иногда они возникают рандомно
Они возникают из-за одновременного доступа к общим ресурсам: SomeQueue и SomeQueue2. Эти операции надо синхронизировать с помощью объектов синхронизации.

Цитата Сообщение от allCrowley Посмотреть сообщение
Почему гарантий нету? Я же условием проверил - если очередь не пустая
Допустим первый поток проверяет условие:
C#
1
if (SomeQueue2.Count != 0)
И оно выполняется - в очереди к примеру один элемент.
Далее второй поток выполняет:
C#
1
string datae = SomeQueue2.Dequeue();
Тем самым, когда первый поток дойдет до операции:
C#
1
string datae = SomeQueue2.Dequeue();
И выполнит ее, то произойдет исключение, из-за которого очень сильно падает производительность.
1
4 / 4 / 4
Регистрация: 29.11.2014
Сообщений: 131
23.11.2016, 02:00  [ТС]
Цитата Сообщение от I2um1 Посмотреть сообщение
И выполнит ее, то произойдет исключение, из-за которого очень сильно падает производительность.
Понял, спасибо!
0
 Аватар для Sanya_sa
913 / 817 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
23.11.2016, 03:27
Цитата Сообщение от allCrowley Посмотреть сообщение
Если использовать Thread неэффективно, то как еще мне за 5 секунд отправить в сеть 100 запросов и обработать их?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private object ObjLock = new object();
 
void SendMsg(object data)
{
  lock(ObjLock)
  {
      // Тут код отправки сообщения
   }
}
 
 
void Send (datas)
{
    foreach(it in datas)
    {
       ThreadPool.QueueUserWorkItem(SendMsg, (object)it.dataSend);
    }
}
datas- массив из обьектов(data) необходимого для отправки сообщения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2016, 03:27
Помогаю со студенческими работами здесь

Работа с потоками
Всем привет, прошу подсказать есть программка рисующая спираль Архимеда так вот нужно распределить потоки между дугами фигуры (один поток -...

Работа с потоками
Вообщем у меня такая ситуация. Хочу при загрузке формы запустить функцию в новом потоке. В этой функции у меня добавляются элементы,...

Работа с потоками
Возникли трудности с потоками. Необходимо, чтобы один поток считывал с консоли, другой выводил эту же информацию на консоль. Поток, который...

Работа с потоками
В общем, сделал рекурсивное удаление файлов и папок в несколько потоков, но вылетают эксепшены что файл уже удален. Можно ли как-то...

Работа с потоками
Добрые люди дайте готовый кусочек кода по работе с потоками Требования такие Запустив энное количество потоков мне надо дождаться их...


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

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

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: показать затраченные материалы за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В качестве. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru