Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.17;
Скачать: CL | DM;

Вниз

Thread, DLL и отрисовка данных   Найти похожие ветки 

 
salexn   (2006-05-19 11:24) [0]

Есть DLL в которой выполняется Thread. При выполнени thread графическое изображение(некая карта состояния).  Связь с Host приложением осуществляется через интерфейс. У интерфейса есть метод GetStatusPicture: TBitmap. Переодически Host приложение перерисовывает карту и другие элементы.
Иногда перерисовывается нормально, иногда в PaintBox белое окно.
В Host приложении используется следующий код:

imgMapStatus.Canvas.Lock;
try
 BitBlt(imgMapStatus.Canvas.Handle, 0, 0, imgMapStatus.Width, imgMapStatus.Height, GetSelectedMap.GetStatusPicture.Canvas.Handle, 0, 0, SRCCOPY);
finally
imgMapStatus.Canvas.UnLock;
end;

imgMapStatus - это PaintBox
GetSelectedMap - возвращает интерфейс на выбранный объект

Как быть? Как избавиться от данной проблемы?


 
Сергей М. ©   (2006-05-19 11:38) [1]

Вызывать упомянутый метод интерфейса в основном кодовом потоке хост-процесса.


 
salexn   (2006-05-19 11:44) [2]

непонял...
Метод возвращает Bitmap с подготовленным "рисунком".
Интерфейс возвращает только данные. Он не имеет управляющих функций, кроме как запустить на выполнение и остановить выполнение. Все действия, обработка данных, "рисование" карты и прочее, выполняется в dll.


 
Сергей М. ©   (2006-05-19 11:49) [3]

приводи код доп.потока..


 
salexn   (2006-05-19 12:02) [4]

FMap: TBitmap;
FMap := Graphics.TBitmap.Create;
FMap.PixelFormat := pf24bit;
FMap.Width := cDefaultMapWidth;
FMap.Height := cDefaultMapHeight;

function TMapper.GetStatusPicture: Graphics.TBitmap;
begin
 FMap.Canvas.Lock;
 try
   Result := FMap;
 finally
   FMap.Canvas.UnLock;
 end
end;

procedure TMapper.DrawZoneStatus(AZoneStart, AZoneLen: int64; AZoneColor: TZoneColor);
begin
 ......
 FMap.Canvas.Lock;
 try
   FMap.Canvas.Brush.Color := AColor;
   FMap.Canvas.FillRect(ARect);
 finally
   FMap.Canvas.Unlock;
 end;
end;

procedure TMapper.InitMap;
begin
 FMap.Canvas.Lock;
 try
   FMap.Canvas.Brush.Color := clWhite;
   FMap.Canvas.FillRect(Rect(0, 0, Width, Height));
 finally
   FMap.Canvas.Unlock;
 end;
end;

Это все что касается отрисовки. Все остальное - это алгоритмы, которые не затрагивают карту.


 
Сергей М. ©   (2006-05-19 12:51) [5]

Ага, теперь вроде бы понятно ..

На время отрисовки в осн.потоке блокируй канву полученного из интерфейса битмапа.



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.029 c
2-1156608865
хм...
2006-08-26 20:14
2006.09.17
Edit


2-1156659780
andy_hs
2006-08-27 10:23
2006.09.17
сделать программу невидимой (службой)


3-1152867964
RitD
2006-07-14 13:06
2006.09.17
Quick Report 3 - создание отчета с 2 колонками


2-1156509853
D@Nger
2006-08-25 16:44
2006.09.17
Как фильтровать по BLOB полю?


15-1156367626
Dbn
2006-08-24 01:13
2006.09.17
The Bat! - "Невозможно окрыть файл ikey.id"