Главная страница
    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.45 MB
Время: 0.036 c
15-1156705716
Nic
2006-08-27 23:08
2006.09.17
Майл-счётчик


3-1152619850
Eskimo
2006-07-11 16:10
2006.09.17
Библиотеки к ADO


15-1156916090
hero
2006-08-30 09:34
2006.09.17
Народ! нужен новенький Client.lic для проги Парус - бюджет


11-1132030796
DmiSb
2005-11-15 07:59
2006.09.17
Нужен аналог VCL DateTimePicker ?


15-1156251570
vain
2006-08-22 16:59
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский