Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
259 / 200 / 49
Регистрация: 18.12.2015
Сообщений: 416
.NET 4.x

Заполнение DataGridView.DataSource в отдельном потоке

19.07.2018, 19:06. Показов 2115. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Данная тема не столь прям не дает жизни мне, но ответ я бы хотел получить.

Имеем гифку типа loading, имеем DGV, которая заполняется в отдельном потоке как .DataSource = DT.
Все бы ничего, пока не заметил, что при:
VB.NET
1
2
3
4
            
Invoke(Sub()
                       DGV.DataSource = DT
                   End Sub)
визуализация гифки подвисает.
Поиск ничего разумного не дал, всякие методы Invoke, Task'и, Token'ы не помогают, либо я не в том направлении копаюсь.
Причем замечено, что при малом кол-ве столбцов в DT "пауз" нет.
Можно конечно расчехлить DT и циклами записывать в DGV, но разве нет какого-либо способа добавлять данные в отдельном потоке, не мешая основному?

На гифке ниже можно увидеть в самом начале паузу.
Изображения
 
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.07.2018, 19:06
Ответы с готовыми решениями:

Не работает ProgressBar в отдельном потоке
Здравствуйте! Помогите с проблемой. Написал код распаковки архива в отдельном потоке с отслеживанием процесса через ProgressBar, но он...

Выполнить функцию в отдельном потоке
Добрый вечер! Есть функция, которая во время выполнения "вешает" программу. Какие варианты решения проблемы? Функция получения...

Загрузка в DataTable из БД в отдельном потоке
Всем привет. Работаю над небольшой программкой, для просмотра таблицы БД Access 2007. Состоит из окна, в нем DataGridView. При загрузке...

14
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
19.07.2018, 22:20
Грузить, конечно, можно как угодно, но чтобы отобразить данные, нужно их всё равно передать в поток UI. Поэтому нужно использовать VirtualMode, суть которого в том, что подгружаются только те данные, которые в данные момент отображаются. Для загрузки нужно использовать события CellValueNeeded, а для реагирования на изменения событие CellValuePushed
0
259 / 200 / 49
Регистрация: 18.12.2015
Сообщений: 416
19.07.2018, 22:51  [ТС]
ViterAlex, спасибо, но немного не то.
Мне необходимо не видеть, как там данные заливаются в DGV, а видеть плавную гифку, пока данные в DGV льются
В моем случае я просто заливаю DataTable в DataSource, данных не так уж много, 15 столбцов и 100 строк, а тормозящая анимация видна.
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
20.07.2018, 10:52
Jungl, а как ты показываешь эту гифку? Отдельной формой?
0
259 / 200 / 49
Регистрация: 18.12.2015
Сообщений: 416
20.07.2018, 12:06  [ТС]
ViterAlex, совсем забыл написать про это...
Гифка в picturebox'е, сам контрол поверх DGV под его размеры и в скрытом режиме.
Включаю видимый режим перед вытягиванием данных в отдельном потоке.

Если смотреть на цикличную запись в DGV и в нем существующие столбцы:
VB.NET
1
2
3
4
5
6
            For Each r In DT.Rows
                Invoke(Sub()
 
                           _dvrequests.Rows.Add(r("ID").ToString, r("P1").ToString, r("P2").ToString, r("P3").ToString.Split(" ")(0), ... , r("P20").ToString)
                       End Sub)
            Next
то проблем с зависанием гифки не наблюдается.
А поскольку у меня есть DGV, где выгрузка происходит по выбору запроса(их несколько и разного формата полей) самим пользователем, то у меня просто голый DGV и заливка через DataSource.
Вроде ничего не забыл.
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
20.07.2018, 12:16
Jungl, думаю будет лучше создать отдельную форму и при загрузке показывать её через ShowDialog.
1
259 / 200 / 49
Регистрация: 18.12.2015
Сообщений: 416
20.07.2018, 12:22  [ТС]
ViterAlex, я тоже так думаю. Возможно кто-то еще даст ответ. Спасибо.
Пока использую костыль в виде разложения столбцов и строк из DataTable.
0
Лень — мое второе и
 Аватар для Orlangur
3228 / 2416 / 687
Регистрация: 28.11.2014
Сообщений: 3,601
Записей в блоге: 3
20.07.2018, 19:23
Jungl, а как насчет плохих методов?
VB.NET
1
2
3
4
 
CheckForIllegalCrossThreadCalls = False
DGV.DataSource = DT
CheckForIllegalCrossThreadCalls = True
0
259 / 200 / 49
Регистрация: 18.12.2015
Сообщений: 416
20.07.2018, 22:02  [ТС]
Orlangur1991, ничего не изменилось, как подвисало на этом месте, так и подвисает)
0
Лень — мое второе и
 Аватар для Orlangur
3228 / 2416 / 687
Регистрация: 28.11.2014
Сообщений: 3,601
Записей в блоге: 3
20.07.2018, 23:58
Jungl, да ну, не
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4359 / 3429 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
24.07.2018, 06:35
Jungl, а вы поток подругому создайте с делегатами вместо простого Invoke... должно быть плавно.. либо background worker
0
Лень — мое второе и
 Аватар для Orlangur
3228 / 2416 / 687
Регистрация: 28.11.2014
Сообщений: 3,601
Записей в блоге: 3
24.07.2018, 11:29
Yury Komar, так без разницы, он все равно будет обновляться в UI потоке.
Думаю тут надо разбираться с SynchronizationContext, что-то читал тут
0
259 / 200 / 49
Регистрация: 18.12.2015
Сообщений: 416
24.07.2018, 23:00  [ТС]
Yury Komar, в том то и дело, что я пробовал с делегатом. Так же пробовал работать с SynchronizationContext(с ним я до конца не разобрался, пробовал по примерам), та же картина..

Прикрепил небольшой пример проекта, посмотрите.
Там как раз те 3 случая, что я использовал. С многопоточностью у меня не совсем гуд, так что критика приветствуется.

Между циклами
VB.NET
1
2
3
        For i = 1 To 100
            Thread.Sleep(10)
        Next
торможение гифки как раз приходится на DataSource = DT.
Вложения
Тип файла: zip MTH_DGV.zip (43.5 Кб, 11 просмотров)
0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
25.07.2018, 00:28
Лучший ответ Сообщение было отмечено Jungl как решение

Решение

Jungl, судя по исходному коду, при присвоении происходит создание коллекции строк внутри dgv пропорционально количеству данных в DataTable. Если стоят параметры расчета высоты строки по вместимости, то накладывается еще дополнительная нагрузка. Так что основной поток будет затыкать из-за циклов внутри dgv. Тут либо хакать dgv (без представления как), либо шаманить с анимацией в отдельном окне
2
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
26.07.2018, 21:04
https://www.cyberforum.ru/post12564534.html

Вот, можно попробовать решить проблему с анимацией. Анимация работает в отдельном потоке. Но опять все будет зависеть от того, что вы будите делать параллельно, нет 100 гарантии что анимация слегка не притормозит. Пробовал на двукоре, при 50% нагрузке иногда кратковременные фризы присутствуют, при меньшей нагрузке полет нормальный. На 4коре слегка фризило при заполнении памяти около 2 Гб. Пробуйте.

Если будите тестить, расскажите о результате. Я код написал, но сам юзать пока не знаю где.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.07.2018, 21:04
Помогаю со студенческими работами здесь

Синтез речи в отдельном потоке
Я подключаю system.speech через референсы. Потом imports system.speech.syntesis У меня проблема. Я имею говорящие часы. При нажатии...

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

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

Парсинг сайта в отдельном потоке
Доброго времени суток... Есть код который парсит отдельный кусок кода с сайта Public Class News Public Sub pars() ...

Сканирование компьютеров в сети в отдельном потоке
На форме есть listbox. в котором выведены имена компьютеров в сети. затем кодом: For Each item In ListBox1.Items ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru