|
управление сложностью
|
|
Многопоточность и доступ к элементам формы17.05.2017, 21:22. Показов 8081. Ответов 21
Метки нет (Все метки)
Приветствую, ребята, подскажите как и что лучше сделать.
Решил написать простенький парсер, в один поток работает все прекрасно, но страдает производительность, поэтому решил сделать многопоточную штуку. Есть несколько вопросов по реализации. Если приложение будет многопоточным, то нужно будет всем потокам обращаться к разным записям одного списка адресов для парсинга. Создал свой класс, который обрабатывает страницы. Теперь стоит вопрос о том, как прикрутить многопоточность. По сути, в потоке должен создаваться класс, который обрабатывает данные. Как эти данные обработать и передать на элементы управления? Например, как из потока получить запись из списка адресов, обработать ее в классе, и далее вывести результат обработки в другой элемент управления ?
0
|
|
| 17.05.2017, 21:22 | |
|
Ответы с готовыми решениями:
21
Как получить доступ к элементам формы из другого обычного класса (не из второй формы) Доступ к элементам формы Доступ к элементам формы |
|
|
||
| 18.05.2017, 08:04 | ||
|
Добавлено через 8 часов 52 минуты Почтальон, могу посоветовать один пример, которым сам пользуюсь. Тут могу говорить, что класс устарел, избыточен и прочее, но мне так нравится. В общем, идея проста. Есть такой класс-BackgroundWorker. Я просто беру его и переопределяю его виртуальный метод OnDoWork, а в нем делаю всю работу. Удобств получается масса, когда не хочется заморачиваться с тасками и прочим, и когда их использование избыточно. Да и на .NET 4.0 работает, а для большинства фишек тасков нужен 4.5 и выше. Чуть попозже сделаю пример, как это работает. Если же нужна параллельность-то тут без тасков не обойтись, ну и PLINQ желательно использовать. Тоже удобная штука, но многое придется реализовывать самому.
1
|
||
|
|
||||||
| 18.05.2017, 09:57 | ||||||
0
|
||||||
|
управление сложностью
|
||||||
| 18.05.2017, 19:57 [ТС] | ||||||
|
Rius, извиняюсь, но что-то туплю.
Допустим есть код:
Думаю что по аналогии можно сделать и для вывода данных из потока в DataGridView. Как вот такое секое можно реализовать ?
0
|
||||||
|
|
|
| 18.05.2017, 20:24 | |
|
И чтение, и изменение данных в контролах UI из потока всегда надо синхронизировать.
В общем случае создаётся некий код. Оборачивается в нечто (делегат, например), что передаётся в поток UI, в очередь сообщений окна. Там из очереди выуживается это нечто, и вызывается исходный код. Пример у меня в 69 строке. Тут ещё несколько: Скорость работы при использовании UpdateProgressDelegate для отображения прогресса Там же во 2 варианте Скорость работы при использовании UpdateProgressDelegate для отображения прогресса приведён устаревший, но всё равно работающий метод: сохранение данных в одном месте, к которому доступ является потокобезопасным. У одного потока на запись, у другого на чтение; либо запись и чтение разграничены семафорами. DataGridView обычно биндится к какому-то источнику данных. Вот в нём и нужно менять данные. Если источник от DataGridView отключен, то если это DataTable, например, его можно менять прямо в другом потоке. Если же подключён - только в потоке UI.
0
|
|
|
управление сложностью
|
|
| 18.05.2017, 20:37 [ТС] | |
|
Поиском находил тот топик, но что-то вникнуть не смог. Как я понял, там устанавливаются значения простым элементам. Я вот что-то никак не догоню, как хотя бы прочитать данные с контрола (из списка адресов) и дальше с ними работать в потоке
0
|
|
|
|
|
| 18.05.2017, 20:42 | |
|
А смысл считывать значения пользователького ввода при уже работающем потоке? Данные надо подготовить до его запуска, потом запустить и дождаться результата.
В редких случаях реальной надобности тот самый второй вариант в нескольких вариациях. Сохранение в простом объекте, неравенство null которого проверяет поток. Сохранение данных в потокобезопасной очереди. В общем-то та же самая синхронизация доступа к данным, только уже в другом направлении, попроще.
0
|
|
|
|
|||||||
| 18.05.2017, 21:54 | |||||||
1
|
|||||||
|
управление сложностью
|
|
| 19.05.2017, 12:35 [ТС] | |
|
Т.е. по сути в каждом потоке нужно будет использовать свой список адресов, вместо использования общего ? Так конечно более логично выглядит. Но как быть тогда с выводом данных от каждого потока в DataGridView, не подскажете ?
0
|
|
|
|
|
| 19.05.2017, 12:41 | |
|
Можно и общий. Зависит от задачи. Вы с ней определились уже?
Добавлено через 2 минуты Почтальон, Нужно обработать список адресов в независимых потоках и получить результат? Или нужно запустить кучу потоков, и манипулировать данными для них уже в ходе работы?
0
|
|
|
|
|||
| 19.05.2017, 12:49 | |||
|
В качестве очереди можно использовать либо обычную Queue<URL> (но тогда нужен lock при доступе), либо ConcurrentQueue<URL>, либо сделать ленивый потокобезопасный итератор поверх List<URL> (я бы так и сделал, но вам такие сложности я думаю не нужны). Хотя я бы посоветовал не делать отдельный список результатов, а результат сохранять в исходном объекте URL (собственно в моем примере так и сделано).
0
|
|||
|
управление сложностью
|
|||
| 19.05.2017, 13:26 [ТС] | |||
![]()
0
|
|||
|
управление сложностью
|
||||||
| 21.05.2017, 21:51 [ТС] | ||||||
|
Попробовал сделать вот таким образом:
Вот хотелось бы поинтересоваться, может не тот контейнер (List) использую для хранения URL ? Я имею ввиду, как проставить галку и отразить этот признак в urls_list (это же по сути список, с которым работает поток и будут работать остальные другие) при окончании получении ответных данных?
0
|
||||||
|
|
||
| 21.05.2017, 22:19 | ||
|
0
|
||
|
управление сложностью
|
|
| 22.05.2017, 08:24 [ТС] | |
|
Storm23, я это понимаю, почитал топик о разделении данных и интерфейса (очень поучительно
)У меня как раз ступор в том, что как из потока "безопасно" поставить метку в контейнере urls_list, чтобы потом эта метка отобразилась на checkLBUrlParse, вот хоть убейте, не отдупляю
0
|
|
|
|
|
| 22.05.2017, 08:25 | |
|
Почтальон, в моём примере что, совсем ничего не понятно?
0
|
|
| 22.05.2017, 08:25 | |
|
Помогаю со студенческими работами здесь
20
Динамический доступ к элементам формы Доступ к элементам формы из класса Доступ к элементам другой формы Публичный доступ к элементам формы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|