Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Когда завершается отрисовка 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).

С большой вероятностью у тебя ошибка в программе.


Наверх

Титульная страница Поиск, карта сайта Написать письмо