powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Обновление UI во время выполнения Task
7 сообщений из 7, страница 1 из 1
Обновление UI во время выполнения Task
    #40129233
iobox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Возникла проблема с отображением процесса вычислений, выполняемых в Task.
Хотелось бы отображать каждую секунду WriteableBitmap, который формируется в потоке, а поверх него DrawingGroup с текстовыми метками, линиями и тп.
Как я понимаю, можно WriteableBitmap засунуть в DrawingGroup, но как это сделать корректно до завершения работы Task?


Код: 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.
37.
38.
39.
40.
41.
42.
43.
        static public WriteableBitmap wb;
        DispatcherTimer _timer = new DispatcherTimer();


            var task = Task.Run(() => {
                int width;
                int height;
                int stride;

                byte[] imgdata1;

                width = 250;
                height = 250;
                stride = width * 4;
                imgdata1 = new byte[height * stride];

                for (int row = 0; row < height; row++)
                {
                    // System.Threading.Thread.Sleep(20);
                    for (int col = 0; col < width; col++)
                    {
                        SetPixelPbgra32(ref imgdata1, row, col, stride, Color.FromArgb(Convert.ToByte((2 * row * col) % 256), Convert.ToByte((2 * row * col) % 256), Convert.ToByte((row * col) % 256), Convert.ToByte((row * col) % 256)));  //Colors.Blue)
                    }
                    BitmapSource gradient1;
                    gradient1 = BitmapSource.Create(width, height, 96, 96, PixelFormats.Pbgra32, null, imgdata1, stride);


                    wb = new WriteableBitmap(gradient1);
                    wb.Freeze();
                }
            } 

     _timer.Tick += _timer_Tick;
     _timer.Interval = new TimeSpan(0, 0, 0, 0, 1000); 
     _timer.Start();

      void _timer_Tick(object sender, EventArgs e)
      {
         Dispatcher.BeginInvoke(new Action(() =>
            {
                myImage.Source = wb;
            }));
      }
...
Рейтинг: 0 / 0
Обновление UI во время выполнения Task
    #40129240
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iobox
отображением процесса вычислений, выполняемых в Task.
обычно для целей информирования изнутри задачи используется подход с передачей в задачу класса Progress<T>
...
Рейтинг: 0 / 0
Обновление UI во время выполнения Task
    #40129570
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iobox , у вас же, вроде, и так реализован показ wb в DispatcherTimer?
Что не так с вашим кодом?

Единственно немного по другому заморозку надо делать.
Вероятность исключения, хоть и очень маленькая, в вашей реализации сохраняется.
Код: c#
1.
2.
3.
     var _wb = new WriteableBitmap(gradient1);
     _wb.Freeze();
     this.wb = _wb;
...
Рейтинг: 0 / 0
Обновление UI во время выполнения Task
    #40129633
iobox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, спасибо, использую IProgress. Теперь то, что нужно.

Eld Hasp, я хотел бы еще наложить сверху линии, метки и т.п. с помощью DrawingGroup, чтобы не заморачиваться с пикселами. А исключение, да, Вы правы.

Честно говоря, я ожидал более быстрого формирования WriteableBitmap 10000 х 10000 точек, учитывая, что там пока даже логики нет.
...
Рейтинг: 0 / 0
Обновление UI во время выполнения Task
    #40129755
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iobox,

ну рендерить пикчу 10000 на 10000 это долго при любом раскладе
вот можешь глянуть, в этом проекте рендерится пикча достаточно быстро мультипоточно в unsafe, это просто примерчик
https://github.com/meytes/WPF.BitmapFire
...
Рейтинг: 0 / 0
Обновление UI во время выполнения Task
    #40129798
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iobox , WriteableBitmap - это DependecyObject.
А в нём все долго.
Всё таки основное предназначение этого типа создание контролов GUI и здесь большой скорости не требуется, но требуется очень много различной логики "на все случаи жизни".
Даже просто присвоение/получение значения DP-свойству будет в сотни, если не тысячи раз медленнее чем обычному свойству.
Если вам нужна скоростная графика, то вам нужно использовать какой-то движок специально предназначенный для этого.
Например, OpenGL. Вот здесь есть ссылка о начальных шагах его использования: Инструкция. Добавляем OpenGL графику на WPF форму с помощью OpenTK.GLControl .

На WPF для такого разрешения, я бы советовал вам другими средствами подготовить растровую графику в формате Bitmap.
А уже потом его перевести в BitmapSource.

Но 100 млн. пикселей (400 МБ) это, по моему, будет долго для любого способа.
...
Рейтинг: 0 / 0
Обновление UI во время выполнения Task
    #40129825
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld Hasp
iobox , WriteableBitmap - это DependecyObject.
А в нём все долго.
Всё таки основное предназначение этого типа создание контролов GUI и здесь большой скорости не требуется, но требуется очень много различной логики "на все случаи жизни".
Даже просто присвоение/получение значения DP-свойству будет в сотни, если не тысячи раз медленнее чем обычному свойству.
Если вам нужна скоростная графика, то вам нужно использовать какой-то движок специально предназначенный для этого.
Например, OpenGL. Вот здесь есть ссылка о начальных шагах его использования: Инструкция. Добавляем OpenGL графику на WPF форму с помощью OpenTK.GLControl .

На WPF для такого разрешения, я бы советовал вам другими средствами подготовить растровую графику в формате Bitmap.
А уже потом его перевести в BitmapSource.

Но 100 млн. пикселей (400 МБ) это, по моему, будет долго для любого способа.

выше пример кидал с WriteableBitmap , картинка там рендерится через unsafe напрямую через память. по тому это фигня, вы сейчас дезинформируйте человека. WritebleBitmap это обычный bitmap заданного формата в памяти
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Обновление UI во время выполнения Task
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]