Форум: "Начинающим";
Текущий архив: 2012.02.12;
Скачать: [xml.tar.bz2];
ВнизКогда завершается отрисовка Image? Найти похожие ветки
← →
i2e (2011-10-27 12:26) [0]Выполняется
ImageTx.Picture.Bitmap := mBmp[3]; ImageTx.Invalidate;
С большой вероятностью, попытка начать новую отрисовку изображения приводит к AccessVialation (AV).
Программа работает час-полтора, показывая на "мигающем" индикаторе процесс обмена данными, потом делает AV.
Можно как-то узнавать, что идёт отрисовка, чтобы не начинать новую?
← →
Омлет © (2011-10-27 12:34) [1]> С большой вероятностью, попытка начать новую отрисовку изображения приводит к AccessVialation (AV).
С большой вероятностью у тебя ошибка в программе.
← →
И. Павел © (2011-10-27 20:22) [2]В справке ясно написано, что ничего страшного при множественном вызове invalidate нет. Контрол перерисуется тогда, когда сможет, а не на каждый invalidate.
"Invalidate informs a control that its entire surface needs to be repainted. Calling Invalidate can prevent flicker caused by a series of partial repaints. There is no performance penalty for calling Invalidate multiple times before the control is actually repainted."
← →
Rouse_ © (2011-10-27 20:52) [3]ImageTx.Picture.Bitmap.Assign(mBmp[3])
← →
i2e (2011-10-28 06:39) [4]Справку читал, да, не должно мешать.
Почему за этот индикатор зацепился - когда просто отключен, программа не виснет.
Попробую еще так:
ImageRx.Picture.Assign(nil);
ImageRx.Picture.Assign(mBmp[3]);
Буду искать. Непременно доложу, что нарыл.
← →
И. Павел © (2011-10-28 08:24) [5]> когда просто отключен, программа не виснет
Когда отключен Invalidate или и "Bitmap:=" и "Invalidate"?
← →
han_malign (2011-10-28 09:36) [6]
SetLampState(aLampState)
InterlockedExchange(FLampState, aLampState);
PaintBox.Invalidate;
OnPaint
PaintBox.Canvas.Draw(X, Y, mBmp[FLampState]);
- причем даже - более-менее(Invalidate завязан на родительский список контролов - если он статичен - то абсолютно -)- потокобезопасно...
← →
han_malign (2011-10-28 09:43) [7]З.Ы. Но правильнее - использовать ImageList - потому что там есть много вкусного...
ilLamp.DrawOverlay(PainBox.Canvas, X, Y, FLampState, FLampSubState);
← →
i2e (2011-10-28 10:38) [8]к [5]:
>> когда просто отключен, программа не виснет
>Когда отключен Invalidate или и "Bitmap:=" и "Invalidate"?
когда отключен индикатор (т.е. и Bitmap, и Invalidate).
к [7]:
ImageList и использовал.
было так:IndicImageList.GetBitmap(LampState, ImageTx.Picture.Bitmap); ImageTx.Repaint;
, где LampState присваивалось 0..5, в зависимости от нужной картинки.
(ранее были сделаны программы, в которых это трудится без нареканий)
"Трясу" дальше...
← →
han_malign (2011-10-28 12:25) [9]
> "Трясу" дальше...
- вариант - OnChange{Invalidate}/OnPaint{<мгновенный штамп или блокировка FIFO>} (я это называю - "ленивый кадр") - помимо отсутствия постоянного создания/разрушения GDI-ресурса и лишнего копирования растра(ImageList ==> Bitmap ==> Image) - гарантирует отзывчивость интерфейса при дребезге состояний(пропуск кадра)...
← →
БезымянныйСтудент (2011-11-02 11:32) [10]А зачем вообще Invalidate? Делайте просто Repaint...
Да и думаю врядли из-за этого может быть AV, даже если там несколько потоков... Поищите в другом месте программы...)
> Программа работает час-полтора, ... , потом делает AV.
Ну так мож у вас там утечка памяти где или типа того?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.02.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c