|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
23.12.2019, 17:52 | #1 |
Пользователь
Регистрация: 22.02.2015
Сообщений: 24
|
Принципы работы потоков - нужно сделать так чтобы все потоки работали с переменной ID по порядку, но при этом не мешали работе друг друга.
Доброго всем времени суток. Пыхчу над многопоточностью в своей поделке и чем дальше лезу, тем меньше становится понятно. Надеюсь поможете мне прояснить ситуацию и как все устроено.
В общем, сейчас ситуация следующая: Создаю в unit1 по тыку на кнопку потоки циклом: Код:
Код:
Если объявить переменную ID без "class var", то получается тоже самое что и один поток, только в х-кратном количестве, т.е. переменная id будет обработана, например, 5 раз вместо одного. Вообще мне нужно сделать так чтобы все потоки работали с переменной ID по порядку, но при этом не мешали работе друг друга. Не могу понять, что я делаю не так, определяю переменные не так, не там, или еще что Вот, надеюсь понятно изложил :с Последний раз редактировалось Vlad2891; 23.12.2019 в 17:56. |
23.12.2019, 19:23 | #2 | ||
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Код:
Код:
Цитата:
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
||
23.12.2019, 22:46 | #3 | |
Пользователь
Регистрация: 22.02.2015
Сообщений: 24
|
Цитата:
Спасибо за подсказку, завтра попробую капнуть глубже в сторону TInterlocked.Increment |
|
24.12.2019, 01:36 | #4 |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,872
|
Имхо несколько непонятна архитектура задачи. Чем должны заниматься эти многочисленные потоки, если результат своей работы они обязательно выдавать в строгой последовательности?
Ведь суть отдельного потока именно в том что он параллельно работает с другими потоками. И сколько ему ОС выделит времени определяет именно ОС. Вы можете лишь задать приоритет потока причем только в трёх уровнях. |
24.12.2019, 06:02 | #5 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Цитата:
Критические секции тоже не плоха себя ведут.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
|
24.12.2019, 10:04 | #6 |
Пользователь
Регистрация: 22.02.2015
Сообщений: 24
|
Много чего уже наворотил, по этому выглядит не очень привлекательно.
Это мой модуль потока. Пишу парсер для одного сайта. Там собираются ИД, обладающие необходимыми свойствами и выводятся в листбокс. Сейчас получается так, что "правильные" ид это 1, 5, 9, а в результате получаю 1, 7, 12. Или что то вроде этого. Когда включаю отладку, то вижу что переменные List и http, не освобождаются, из за этого одни и те же данные в List обрабатываются двумя и более потоками и только потом он освобождается RadioButton'ы отвечают за способ проверки ИД: Случайный в диапазоне или по порядку. Код:
Последний раз редактировалось Vlad2891; 24.12.2019 в 10:07. |
25.12.2019, 10:12 | #7 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Я даже не знаю что тут сказать... Всё очень плохо.
Допустим у нас 3 потока 1 главный 2 и 3 которые выполняют работу. 1) Код:
Второй поток уснул после CS.Leave; третий изменил ID и второй проснулся они оба читают страницу с одинаковым ID. 2) Тут опять таки ID не экранирован Код:
Но 3 потоку ничего не мешает изменить ID. 3) TInterlocked.Increment(ID); - увеличивает ID на 1. Поэтому у вас цифры и не совпадают. Третья проблема решается легко убрав TInterlocked.Increment(ID); у вас и так есть критическая секция. Если вторую проблему легко решить Код:
То с первой так не выйдет. Поэтому предлагаю переписать весь код на TParallel.For http://docwiki.embarcadero.com/RADSt...amming_Library
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . Последний раз редактировалось Pavia; 25.12.2019 в 10:15. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как сделать, чтобы клетки не заходили друг на друга | Роман12212221 | C# (си шарп) | 0 | 06.12.2017 15:55 |
Как сделать чтоб столбцы равнялись друг на друга | bodalev | HTML и CSS | 2 | 12.05.2015 21:18 |
Uses. Правильно обьявить 2 класса, чтобы те взаимно использовали друг-друга. | Человек_Борща | Общие вопросы Delphi | 3 | 03.06.2012 08:06 |
как реализовать чтобы при нажатии прямоугольники меняли цвета не зависимо друг от друга | programmm | Win Api | 0 | 18.05.2011 17:50 |