Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.46 MB
Время: 0.048 c
2-1156659994
AlexeyT
2006-08-27 10:26
2006.09.17
Как переключаться на дочернюю форму через Alt+Tab


15-1156232503
Gorlum
2006-08-22 11:41
2006.09.17
Вырезать часть фильма


1-1154530693
zinetz_victor
2006-08-02 18:58
2006.09.17
Почему может падать Parent := panel1;


2-1156085088
AlexanderMS
2006-08-20 18:44
2006.09.17
Узнать об открытии папки.


15-1155462028
tButton
2006-08-13 13:40
2006.09.17
две проблемы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский