Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
 Аватар для Dr_FvKE
14 / 11 / 1
Регистрация: 16.08.2016
Сообщений: 75

Асинхронная отрисовка элементов управления на форме

21.08.2021, 14:53. Показов 3020. Ответов 9

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые!

Имею следующую задачу: отрисовать n-ое кол-во однотипных объектов на форме, их может быть 2, а может быть и 30.
Вместе с тем имею следующую проблему, которая заключается в том, что объект является панелью (System.Windows.Forms.Panel), на ней находятся несколько изображений, лейблов. При непосредственной отрисовке такого объекта через цикл, повторюсь, их может быть 30, 1) приложение подвисает, что неудивительно при использовании for 2) "мигают" форма и сами добавляемые объекты при каждом ходе цикла (Doublebuffered = true).

Вопрос: можно ли и если можно, то как реализовать отрисовку (добавление на форму объектов) в фоне?
Обычные таски и треды не подходят из-за известном ограничении управления объектами из того потока, в котором они были созданы. BackgroundWorker не пробовал, но подозреваю, что получу то же исключение, что и с ранее упомянутыми.

P.S. Если это будет важным, то вот немного подробнее описание происходящего: на форме находится TabControl, на одну из его вкладок TabPage через цикл добавляется пользовательский элемент управления через команду Controls.Add(UserControl).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.08.2021, 14:53
Ответы с готовыми решениями:

Нет элементов управления на форме
Здравствуйте, уважаемые! Выдали мне на руки чужой код из инета, нужно его подогнать под наши нужды. Но тут я столкнулась с очень...

Мерцание элементов управления на форме
Создавая приложение Windows Forms, столкнулся с проблемой мерцания. По информации в интернете не совсем понятно что и где надо указывать. ...

Перебор элементов управления на форме
Нужно подобрать элементы (button, label), чтото вроде этого: foreach (int i in Label) { MessageBox.Show(label.Text); }

9
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3419 / 2738 / 575
Регистрация: 04.09.2018
Сообщений: 8,607
Записей в блоге: 3
21.08.2021, 19:23
Dr_FvKE, не помню как называлась эта тема, но буквально недавно сам ее смотрел, здесь на форуме. Там как раз были применены UserControl'ы и как раз обсуждалась (была решена) проблема с мерцанием/торможением. Поищите. Если мне попадется снова, сообщу.

Добавлено через 57 секунд
Вроде речь шла о программе не то тестов, не то справочников...
1
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,687
Записей в блоге: 2
21.08.2021, 19:27
Решать то вам как это приемлимо будет. Используйте те подходы которые существуют (известны и часто используются) в веб-е например. Но важно ещё то какие требования у вас к отрисовке - нужно ли отображать основную форму; добавлять динамически во время работы или ещё как.
Простой пример - скроллим и доходим до последнего нарисованного блока. Дальше что предполагается? подгрузить ещё? можно ли заблокировать весь список для этого или как...

Есть вариант - чтобы не "мигало" добавлять все объекты сразу в список. А внутренний контент блокировать и показывать иконку бесконечной загрузки. Когда оно подгрузится и нарисуется то дёрганий не будет, так как контейнер уже был нарисован фиксированного размера.

Короче смотря какие контролы, смотря сколько, смотря на что вы готовы...
0
 Аватар для Dr_FvKE
14 / 11 / 1
Регистрация: 16.08.2016
Сообщений: 75
21.08.2021, 19:52  [ТС]
Еще раз, мое поле боя - это TabPage, создание панелей происходит в момент выбора определенной вкладки на TabControl.
На момент отрисовки можно блокировать все вкладку, но, желательно, не форму. Тормоза и мигания у меня происходят с 6 объектами, несколько лет назад я делал аналогичный проект и там было около 30-40 таких элементов - они грузились меньше чем за секунду и без тормозов каких либо, а сейчас даже память поджирает хорошенько, об этом и списках - ниже привел код, вызываемый при выборе вкладки.

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
public static async void ShowLocalMods(TabPage Page)
{
    // SetInterface содержит в себе "конструктор" из
    // которого в создаваемые элементы будут распределены данные
    //
    // _points содержит массив координат для размещения каждой из панелей,
    // рассчитывается который в SetMarkerWeb, там координаты высчитываются
    // для двух столбцов панелей и n строк
    //
    // _cells содержит массив новоиспеченных панелей
 
    List<SetInterface> _sets = GetLocalSets();
    List<Point> _points = Interface.SetMarkerWeb(_sets.Count, new Size(350, 169), Page.Size);
    Panel[] _cells = new Panel[_sets.Count];
 
    // заносим в массив все панели с уже внесенными данными        
    for (int i = 0; i < _sets.Count; i++)
        _cells[i] = Elements.DrawLocalMods(_sets[i], _points[i]);
 
    // костыльно пытаемся отрисовать все во втором потоке
    await Task.Factory.StartNew(() =>
    {
        Page.Invoke(new Action(() =>
        {
            Page.Controls.Clear();
            Page.Controls.AddRange(_cells);
        }));
    }, TaskCreationOptions.LongRunning);
 
    // ну и пытаемся, также уничтожить следы, потому что после каждого хода
    // цикла потребление ОЗУ увеличивается на 150-200МБ, а то,
    // что ниже - не помогает, скрин прикладываю
    _sets.Clear();
    _points.Clear();
    _cells = null;
}
Миниатюры
Асинхронная отрисовка элементов управления на форме  
0
 Аватар для Dr_FvKE
14 / 11 / 1
Регистрация: 16.08.2016
Сообщений: 75
21.08.2021, 22:03  [ТС]
HF, Все что более менее подходит под ваш вопрос - выше.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
22.08.2021, 16:34
await по идеи должен быть на получении данных для ваших cells, а не попытке их отрисовать. Что делает метод GetLocalSets?
0
 Аватар для Dr_FvKE
14 / 11 / 1
Регистрация: 16.08.2016
Сообщений: 75
22.08.2021, 17:20  [ТС]
Wolfdp, получает список комплектов, на каждый комплект - один файл с JSON содержимым.
Миниатюры
Асинхронная отрисовка элементов управления на форме  
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
22.08.2021, 21:01
Я бы ожидал увидеть await ReadToEndAsync, а не закидывание в отдельную таску отрисовку по Invoke. Причем если ShowLocalMods вызывается по условной кнопке, то Invoke вообще бесмысленный -- диспетчер вернет управление в главный поток.

Считывание с файла по идеи должно быстро происходить и к миганиям не должно приводить. Хотя может и не прав, и у вас реально подвисает на вычитке и десериализации.
0
 Аватар для Dr_FvKE
14 / 11 / 1
Регистрация: 16.08.2016
Сообщений: 75
22.08.2021, 21:13  [ТС]
Wolfdp, да, вы правы, считывание происходит мгновенно и скорее всего подвисание происходит из-за того, что добавляется около 10 объектов за один ход цикла и просто не хватает времени на их отрисовку. Делал для теста добавление одной панели 10 раз - добавило за секунду без морганий и прочего, в отличии от того варианта, который сейчас.
0
 Аватар для Dr_FvKE
14 / 11 / 1
Регистрация: 16.08.2016
Сообщений: 75
25.10.2021, 13:03  [ТС]
Проблема решена, всем спасибы, кто помогал в решении
Код для формы перерисовки:

C#
1
2
3
4
5
6
7
8
9
protected override CreateParams CreateParams
{
    get
    {
        CreateParams handleParam = base.CreateParams;
        handleParam.ExStyle |= 0x02000000;   // WS_EX_COMPOSITED       
        return handleParam;
    }
}
Источник:
https://coderoad.ru/8046560/ка... C-winforms
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.10.2021, 13:03
Помогаю со студенческими работами здесь

Анимация элементов управления на форме
Необходимо создать форму с некоторыми элементами (buttons, textboxes, checkboxes...). При нажатии на одну из кнопок элементы должны...

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

Сохранение состояния элементов управления на форме
Добрый вечер! В программе, форма является владельцем визуальных компонентов. Используя этот факт, пишу код для сохранения состояния...

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

Динамическое изменение набора элементов управления на форме
Подскажите как сделать, чтобы по клику на кнопку создать в меню (создать/открыть/сохранить/сохранить как/...) исчезала картинка с...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
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 На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru