На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

консультация по методу TMapScreen.ScreenRepaint

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 След.
RSS
консультация по методу TMapScreen.ScreenRepaint
 
Здравствуйте господа разработчики ГТК.
Возник вопрос по методу ScreenRepaint компоненты TMapScreen
Наш код написан таким образом, что периодически, функция scrDrawMap внутри нижеописанного метода срабатывает аварийно (многонитевая программа - несколько TThread)
После сбоя, методу "уходит" в ветку except
Вопрос:
Что делает ветка except и когда она срабатывает ???

Код
procedure TMapScreen.ScreenRepaint(aPaintRectInWin : PRect);
var
  rect1 : TRECT;
  position : TPOINT;
  ScreenDc : HDC;
begin

  ScreenDc := 0;

 try

  if FMapScreen = 0
     then exit;

  FPaintPosHor := MapLeft; // 16/01/2004
  FPaintPosVer := MapTop;

  if aPaintRectInWin <> nil
     then begin

       position.x := aPaintRectInWin.Left;
       position.Y := aPaintRectInWin.Top;

       rect1 := rect(aPaintRectInWin.Left   + FPaintPosHor,
           aPaintRectInWin.Top    + FPaintPosVer,
           aPaintRectInWin.Right  + FPaintPosHor,
           aPaintRectInWin.Bottom + FPaintPosVer);

     end
     else begin

       position.x := 0;
       position.Y := 0;

       rect1 := rect(FPaintPosHor,
                     FPaintPosVer,
           FPaintPosHor + width,
           FPaintPosVer + height);
     end;

  pf_scrDrawMap(FMapScreen, rect1, position);

  FScreenUpdateBeforePaint := false;  // 27/04/2009

  if Assigned(FOnMapScreenUpdate)
     then FOnMapScreenUpdate(Self, rect1, position.x, position.y);

//  FScreenUpdateBeforePaint := false; 27/04/2009

  except
    if ScreenDc <> 0
       then pf_scrReleaseDC(FMapScreen);
  end;

end;


----------------
Код содержит следующую переменную "судба которой "выглядит вот так:
Код
var
  ScreenDc : HDC;
begin
  ScreenDc := 0;
    ....
  try
 ....
  except
    if ScreenDc <> 0
       then pf_scrReleaseDC(FMapScreen);
  end;
end;

Второй вопрос, в каком случае срабатывает pf_scrReleaseDC ?
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Какую версию ГТК используете? Когда-то давно были проблемы с многопоточностью, сейчас все решено.
Ветка except используется для обработки аварийных ситуаций.
 
Инструментарий разработчика ГИС-приложений GIS ToolKit (версия 11.11.5) 28.07.2014 56,8 Mb gistool11.zip
скачаная только что с сайта (для сравнения)
Цитата
Andrey Gheleznyakov пишет:
Ветка except используется для обработки аварийных ситуаций.
Андрей Владиславович, вопрос, в каких случаях эта ветка сработает вообще ?
Уточняющий вопрос, где и при каких условиях значение ScreenDc становится НЕ равным нулю?
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
ScreenDc осталась от старых текстов и в данном контексте она всегда равна 0.
 
Цитата
Andrey Gheleznyakov пишет:
ScreenDc осталась от старых текстов и в данном контексте она всегда равна 0.
Это я понимаю, я не понимаю когда и каким образом освобождается буфер (scrReleaseDC)
Судя по коду буфер банально "жрёт" память   :?:

Код
pf_scrDrawMap(FMapScreen, rect1, position);
if ScreenDc <> 0 // никогда не равен
       then pf_scrReleaseDC(FMapScreen); // никогда не выполняется и не освобождается памить???
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Освобождается теперь в одном методе Destroy компонента TMapScreen. Код по освобождению выше можно убрать.
 
Цитата
Andrey Gheleznyakov пишет:
Код по освобождению выше можно убрать.
а что произойдёт при аварийном выполнении  pf_scrDrawMap(FMapScreen, rect1, position); ?
Кстати, при обильной нагрузке ядра функция pf_scrDrawMap в этом месте не выдерживает  :oops:
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Произойдет исключительная ситуация, которая отловится в except
 
Цитата
Andrey Gheleznyakov пишет:
которая отловится в except
и что произойдёт дальше? у меня после нескольких таких except-ов выскакивает исключение OutOfMemory  :cry:
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Выслать пример с такой ситуацией можно?
Страницы: 1 2 След.
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности