Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 006

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!

Можно ли работать в потоке с классом TBitmap без использования Synchronize?

Поясню на всякий случай: отрисовка на Bitmap идёт внутри потока, потом через Synchronize вызывается метод главной формы, который рисует этот Bitmap.
При такой реализации через некоротое время программа выдаёт исключение EOutOfResource, хотя никаких потерь памяти не происходит.

Если вынести рисование в Synchronize, то все работает без проблем, но тогда полностью теряется смысл использования потока (работа с графикой в данном случае сильно грузит систему).

Задаю вопрос в этот раздел, т.к. он касается работы VCL и TThread.

P.S. В CLX такого не наблюдается, но приложение по большей части уже готово и миграция его под CLX невозможна.

Soulnet Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Soulnet (статус: Посетитель)
Вопрос отправлен: 25 октября 2007, 22:03
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Soulnet!
Если в теле потока происходит отрисовка на TBitmap, который пренадлежит потоку, то проблем с синхнронизацией не должно быть. Потому, что TBitmap не есть оконным элементом.
Сообщение EOutOfResource не означает, что у вас происходят утечки памяти. Это утечки ресурсов. Дело в том, что каждое окно в системе (кнопка в понятии windows - окно, а label - нет, это просто нарисованно на форме) требует одного хендла. А Форма требует где то 4-5 (на само окно, на pen и brush для Canvas, на Font). Это не было бы проблемой, если бы кол-во хендлов на процесс не было бы ограничено в 10000. (именно по этому одна программа не может создать больше где то 1300 форм одновременно).
У вас наверно при отрисовке где то не освобождается хендл, а так как отрисовка идёт часто (так я понял), то они и кончаются. Нужно искать, где вы утеряли. А для этого, нужно смотреть код.

Согласно справке, отрисовка на TCanvas потокобезопасна. тоесть, получив ссылку на канвас формы, можно с потока рисовать на ней. Даже с нескольких потоков. Вот только что они нарисуют - это другое дело.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 26 октября 2007, 11:57
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 26 октября 2007, 21:08; участников в обсуждении: 1.
Soulnet

Soulnet (статус: Посетитель), 26 октября 2007, 21:08 [#1]:

Я нашёл решение в соседней теме. Необходимо было заключить рисование в блок Canvas.Lock/Unlock.

Похоже это необходимое действие при любых операциях рисования, т.к. каждый поток рисовал на свой TBitmap.Canvas и при отрисовке в форме блокировался Syncronize.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.02 сек.