Как предотвратить PictureBox внутренне обновляется? - PullRequest
1 голос
/ 31 января 2012

У меня очень быстрый цикл, который визуализирует анимацию в буфере растровых изображений и добавляет к нему фильтр (используя LockBits / UnlockBits для доступа к необработанным данным и изменениям Marshaling.) В независимом потоке.

Я хотел выяснить способ отображения рендера на форме в режиме реального времени, поэтому я создал PictureBox и связал его изображение с созданным растровым изображением. Каждый раз, сразу после разблокировки растрового изображения, я обновлял PictureBox (используя делегат для выполнения многопоточности), чтобы рендеринг обновлялся правильно.

Это совершенно нормально и работает очень быстро, но возникла одна большая проблема, когда я попытался перетащить форму на границу экрана, чтобы посмотреть, не появится ли какая-либо ошибка, и, к сожалению, приложение рухнет ... говоря 'растровое изображение блокируется 'Это происходит, когда либо другое окно движется над PictureBox, либо PictureBox частично перетаскивается из экрана. Я подозреваю это, потому что PictureBox может обновить себя, когда перерисовка необходима, и это происходит, когда растровое изображение все еще заблокировано. Так ... любой способ решить эту проблему? Или еще какие-нибудь способы сделать мою анимацию лучше?

Ответы [ 2 ]

1 голос
/ 31 января 2012

Одним из возможных решений может быть создание собственного пользовательского MyPictureBox : PictureBox (скажем) класса, который переопределяет OnPaintBackground, например:

protected override OnPaintBackground(...)
{
   // nothing, an empty method
}

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

Что I сделает лично, учитывая ваш комментарий:

У меня очень быстрый цикл, который отображает анимацию в буфере Bitmap и добавляет фильтр к нему (используя LockBits / UnlockBits для доступа к сырой данные и маршалинг к ним изменяются.) в отдельном потоке

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

Имо, это лучший выбор.

0 голосов
/ 31 января 2012

Вы не можете сделать это.

Вместо этого вы должны скопировать изображение (в фоновом потоке) и поместить копию в PictureBox.

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

...