Главная страница
    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
1-1154708929
ancot
2006-08-04 20:28
2006.09.17
TFrame TAction и ShorCut


3-1152600642
Chort
2006-07-11 10:50
2006.09.17
сортировку данных в колонке DBgrid


15-1156707585
Loginov Dmitry
2006-08-27 23:39
2006.09.17
Вопреки ругани форумчан


2-1156900418
SerJaNT
2006-08-30 05:13
2006.09.17
TImage и большие файлы


15-1156717348
kaif
2006-08-28 02:22
2006.09.17
Принтер Zebra - с чего начать чайнику?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский