Главная страница
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.48 MB
Время: 0.051 c
2-1156944150
alles
2006-08-30 17:22
2006.09.17
Как правильно вызывать функцию из ДЛЛ?


15-1156730532
vidiv
2006-08-28 06:02
2006.09.17
Авторефераты диссертаций


1-1154988125
Яков
2006-08-08 02:02
2006.09.17
Boolean поле(нужна помощь, сроки поджимают, горю!)


2-1157048565
Dmitry T
2006-08-31 22:22
2006.09.17
Всплывающий индикатор


15-1156433368
DillerXX
2006-08-24 19:29
2006.09.17
Ловля ошибок в многопоточном приложении