Форум: "WinAPI";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.064 c