C # Загрузка растрового изображения в PictureBox - медленно и блокирует пользовательский интерфейс .. какие-либо альтернативы? - PullRequest
3 голосов
/ 13 ноября 2010

Я загружаю 640x480 растровых изображений в графическое окно один за другим. Когда я это делаю, мой пользовательский интерфейс блокируется. Например, если бы я печатал что-то в текстовом поле, которое находится в той же форме, что и мое графическое окно, я бы не смог увидеть клавишу, которая была нажата сразу, поскольку загрузка растрового изображения делает интерфейс очень медленным. Как справиться с этим? есть ли способ обойти это? Любой пример кода будет замечательно.

Спасибо

Ответы [ 2 ]

3 голосов
/ 13 ноября 2010

A Picturebox на самом деле довольно «тяжелый» контроль в том, что он обеспечивает; это может быть неуместным, чтобы использовать здесь. Вы могли бы рассмотреть намного более простое управление контейнером или рисование на поверхности самой формы.

Если вы хотите рассмотреть BackgroundWorker или любую другую технику с резьбой, помните, что само рисование должно происходить в потоке пользовательского интерфейса; Обойти это невозможно.

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

Также; если вы выполняете какое-либо масштабирование изображений, это будет уместно в фоновом потоке - в этом случае самому коду рисования нужно только нарисовать немасштабированный прямоугольник; Использование функциональности GDI + DrawUnscaled для копирования растрового изображения в область точно такого же размера на самом деле довольно быстро.


Чтобы перейти к чему-то более конкретному, например к реальному коду, я бы хотел увидеть код того, как вы это делаете сейчас. Я даже не уверен, что вы «рисуете» изображения в первую очередь, а не просто устанавливаете Picture / Image свойства.

3 голосов
/ 13 ноября 2010

Используйте фоновый рабочий, чтобы графический интерфейс не зависал (асинхронный вызов отображения изображения).http://www.dreamincode.net/forums/topic/112547-using-the-backgroundworker-in-c%23/

Ваш второй запрос немного сложнее, я думаю, что короткий ответ не будет полагаться на gdi +, если вы этим занимаетесь, потому что он известен как медленныйКак именно вы загружаете изображение в графическое окно?

...