Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
 Аватар для afapasha
28 / 28 / 19
Регистрация: 12.10.2014
Сообщений: 98

Зависание контрола DataGridView при добавлении Row из других потоков

31.10.2016, 18:57. Показов 3069. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На форме имеется грид с 4 колонками.
Существует класс, в котором несколько потоков выполняют определённый метод и при нужном условии вызывают событие, которое, в свою очередь, вызывает на форме метод вида:
C#
1
2
3
4
private void requestManager_OnGoodPerson(object sender, ConfirmedPersonEventArgs e)
        {            
                dgvPersons.Rows.Add($"{e.Name}:{e.Surname}", e.Age, e.Salary, e.PersonalNumber);
        }
В первые секунды всё работает нормально, но после быстрого наплыва событий, контрол(Не форма) перестаёт работать корректно(На нём уже нельзя выбрать нужный элемент и перестают добавляться новые записи).
Я подумал, может нужно синхронизировать доступ к гриду, т.к (Может быть, не уверен) метод вызываемый событием выполняется в том же потоке, который его вызвал), В общем добавил lock, но и это тоже не помогло.

Объясните как Грамотно реализовать данную задачу, Спасибо!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.10.2016, 18:57
Ответы с готовыми решениями:

Ошибка при добавлении своего контрола на форму
Здравствуйте! У меня постоянно возникает одна и та же ошибка. Лично для меня не слишком критичная, но в некоторых моментах критичная. ...

Зависание домашней сети при добавлении ПК
Доброго времени суток дома установлен роутер ZyXEL Keenetic Omni II пока в сети 2 ноутбука и 2 смартфона все отлично работает...

Ошибка при добавлении пользовательского контрола на форму в режиме дизайнера
Либа написанная мною для личных нужд. В нее написал новый юзерконтрол , включающий те которые в этой либе были. Повесил этот компонент на...

3
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
31.10.2016, 19:35
Цитата Сообщение от afapasha Посмотреть сообщение
Объясните как Грамотно реализовать данную задачу
Ну во-первых, данные нужно заносить не в DGV, а в модель данных. DGV должна только отображать модель через DataBinding, или через виртуальный режим.
Далее, если используется DataBinging, то при добавлении данных в список, нужно использовать метод Invoke для перевызова метода в главном потоке (поскольку биндинг вызывает перестройку грида, а грид, как и все контролы работает только в главном потоке). Этот метод можно использовать при относительно медленном потоке данных.
Если же используется виртуальный режим, то Invoke не требуется , а просто увеличивается число строк грида и вызывается Invlidate у грида. Если данные добавляются очень быстро (например сотни в секунду), тогда делается немного по-другому. Данные в список добавляются в обычном режиме, без вызова Invalidate, но параллельно работает таймер, который раз в секунду в главном потоке увеличивает число строк датагрида и вызывает Invalidate.
0
 Аватар для afapasha
28 / 28 / 19
Регистрация: 12.10.2014
Сообщений: 98
31.10.2016, 19:51  [ТС]
Storm23, Я пытался привязать к биндингу, но у меня вопрос появился, биндинг получил запись, я вызвал метод отображения его в гриде, но когда у меня будет 1000+ записей, не будет ли зависать грид при перестройке?

Добавлено через 11 минут
Сделал через виртуальный режим, контрол теперь не зависает, элементы добавляются, но их значения не отображаются, просто пустые поля, разбираюсь в чем проблема теперь
Если есть свободное время, прошу сбросить пример с работой через виртуальный режим
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
31.10.2016, 20:14
Лучший ответ Сообщение было отмечено afapasha как решение

Решение

Цитата Сообщение от afapasha Посмотреть сообщение
их значения не отображаются
А вы событие CellValueNeeded обрабатываете? Без него данные в грид никак не попадут.
Цитата Сообщение от afapasha Посмотреть сообщение
пример с работой через виртуальный режим
Архитектура ПО в WinForms (FAQ & HowTo)
https://www.cyberforum.ru/blog... g3838.html
Альтернатива Invoke при изменении GUI с другого потока
Добавление строк в datagridview в другом потоке

Цитата Сообщение от afapasha Посмотреть сообщение
но когда у меня будет 1000+ записей, не будет ли зависать грид при перестройке?
На 1000 - не будет зависать, на 100000 - будет. Если нужно отображать очень много данных, то альтернативы виртуальному режиму - нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.10.2016, 20:14
Помогаю со студенческими работами здесь

Зависание потоков при обращени к ListBox
Столкнулся со следующей проблемой. Есть основная форма приложения. Есть рабочие потоки. В качестве логера им передается адрес ListBox'a на...

Как правильно подбирать значение положения контрола при динамическом добавлении в panel?
В программе динамически добавляется в панель несколько элементов panel1.Controls.Add(qwerty);// где qwerty контрол в программе...

Тупит отладчик при отладке других потоков
у меня vs community 2015, при отладке других потоков (созданных своим же приложением) отладчик тупить начинает, т.е. например если...

Форма подвисает при выводе на неё из других потоков
Доброго времени суток, проблема такая: пишу прогу для АСУТП, которая должна считывать множество данных с устройства и выводить их. Для...

Ошибка при добавлении данных в datagridview
Есть бд сделанная в acess. При добавлении данных в одной форме,они должны перейти на другую и появится в datagridview. Но при нажатии...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru