![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Thread, DLL и отрисовка данных
salexn © (2006-05-19 11:24:00)Есть 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 12:51:00) [1]Ага, теперь вроде бы понятно ..
На время отрисовки в осн.потоке блокируй канву полученного из интерфейса битмапа.
salexn (2006-05-19 12:02:00) [2]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 11:49:00) [3]приводи код доп.потока..
salexn (2006-05-19 11:44:00) [4]непонял...
Метод возвращает Bitmap с подготовленным "рисунком".
Интерфейс возвращает только данные. Он не имеет управляющих функций, кроме как запустить на выполнение и остановить выполнение. Все действия, обработка данных, "рисование" карты и прочее, выполняется в dll.
Сергей М. (2006-05-19 11:38:00) [5]Вызывать упомянутый метод интерфейса в основном кодовом потоке хост-процесса.