![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Когда завершается отрисовка Image? [D7, XP]
i2e © (2011-10-27 12:26:00)Выполняется
ImageTx.Picture.Bitmap := mBmp[3]; ImageTx.Invalidate;
С большой вероятностью, попытка начать новую отрисовку изображения приводит к AccessVialation (AV).
Программа работает час-полтора, показывая на "мигающем" индикаторе процесс обмена данными, потом делает AV.
Можно как-то узнавать, что идёт отрисовка, чтобы не начинать новую?
БезымянныйСтудент (2011-11-02 11:32:00) [1]А зачем вообще Invalidate? Делайте просто Repaint...
Да и думаю врядли из-за этого может быть AV, даже если там несколько потоков... Поищите в другом месте программы...)
> Программа работает час-полтора, ... , потом делает AV.
Ну так мож у вас там утечка памяти где или типа того?
han_malign (2011-10-28 12:25:00) [2]
> "Трясу" дальше...
- вариант - OnChange{Invalidate}/OnPaint{<мгновенный штамп или блокировка FIFO>} (я это называю - "ленивый кадр") - помимо отсутствия постоянного создания/разрушения GDI-ресурса и лишнего копирования растра(ImageList ==> Bitmap ==> Image) - гарантирует отзывчивость интерфейса при дребезге состояний(пропуск кадра)...
i2e (2011-10-28 10:38:00) [3]к [5]:
>> когда просто отключен, программа не виснет
>Когда отключен Invalidate или и "Bitmap:=" и "Invalidate"?
когда отключен индикатор (т.е. и Bitmap, и Invalidate).
к [7]:
ImageList и использовал.
было так:
IndicImageList.GetBitmap(LampState, ImageTx.Picture.Bitmap); ImageTx.Repaint;, где LampState присваивалось 0..5, в зависимости от нужной картинки.
(ранее были сделаны программы, в которых это трудится без нареканий)
"Трясу" дальше...
han_malign (2011-10-28 09:43:00) [4]З.Ы. Но правильнее - использовать ImageList - потому что там есть много вкусного...
ilLamp.DrawOverlay(PainBox.Canvas, X, Y, FLampState, FLampSubState);
han_malign (2011-10-28 09:36:00) [5]
SetLampState(aLampState)
InterlockedExchange(FLampState, aLampState);
PaintBox.Invalidate;
OnPaint
PaintBox.Canvas.Draw(X, Y, mBmp[FLampState]);
- причем даже - более-менее(Invalidate завязан на родительский список контролов - если он статичен - то абсолютно -)- потокобезопасно...
И. Павел (2011-10-28 08:24:00) [6]> когда просто отключен, программа не виснет
Когда отключен Invalidate или и "Bitmap:=" и "Invalidate"?
i2e (2011-10-28 06:39:00) [7]Справку читал, да, не должно мешать.
Почему за этот индикатор зацепился - когда просто отключен, программа не виснет.
Попробую еще так:
ImageRx.Picture.Assign(nil);
ImageRx.Picture.Assign(mBmp[3]);
Буду искать. Непременно доложу, что нарыл.
Rouse_ (2011-10-27 20:52:00) [8]ImageTx.Picture.Bitmap.Assign(mBmp[3])
И. Павел (2011-10-27 20:22:00) [9]В справке ясно написано, что ничего страшного при множественном вызове 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."
Омлет (2011-10-27 12:34:00) [10]> С большой вероятностью, попытка начать новую отрисовку изображения приводит к AccessVialation (AV).
С большой вероятностью у тебя ошибка в программе.