Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2007, 22:47   #1
Sergey_nl
Пользователь
 
Регистрация: 02.07.2007
Сообщений: 23
По умолчанию TBitmap в многопоточном приложении

Есть 2 потока. Один главный, для отображения формы, второй вычислительный.
На форме находится TImage, для которого второй поток рассчитывает изображение.
При явном доступе к TImage.Canvas.Pixels некоторые точки почему-то остаются белыми, даже если обрамлять в Lock/Unlock.
Попробовал заполнять сначала временный TBitmap, порождаемый в вычислительном потоке, затем в функции, вызываемой через Synchronize копирую получившийся битмап с помощью TCanvas.CopyRect на TImage.Canvas главной формы.
Так последнее происходит лишь с некоторой вероятностью, в большинстве случаев отображаемое содержимое не меняется.
Подозреваю, грабли могут быть в инициализации и создании TBitmap. Иногда для начала загружал в него готовую картинку - тот же эффект.
Может вообще нельзя обращаться к графическим элементам из других потоков?
Проекты для лучших программистов http://www.netlancer.ru
Sergey_nl вне форума Ответить с цитированием
Старый 04.07.2007, 20:17   #2
Sergey_nl
Пользователь
 
Регистрация: 02.07.2007
Сообщений: 23
По умолчанию

Разобрался сам.
Поместил в Synchronize все функции работы с графическими объектами, в том числе и с принадлежащими TThread.
Пришлось писать оболочки для Pixels, Line, OutText, поскольку в Synchronize, похоже, нельзя передавать параметры вызываемой функции.
Как-то неэлегантно. Может есть ещё решения?
Проекты для лучших программистов http://www.netlancer.ru
Sergey_nl вне форума Ответить с цитированием
Старый 05.07.2007, 09:05   #3
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

конфликт прорисовки
попробуй использовать критическую секцию
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 09.07.2007, 00:34   #4
Sergey_nl
Пользователь
 
Регистрация: 02.07.2007
Сообщений: 23
По умолчанию

Как я понял, Synchronize делали через критические секции или семафоры.
В общем, если выводить по пикселям, на каждый пиксель делать Synchronize, то основной поток тормозить начинает жутко, таймер в нём не успевает отрабатывать и т.д.
Сделал показ после просчёта каждой строки - с этим уже можно жить.
Проекты для лучших программистов http://www.netlancer.ru
Sergey_nl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поддержка Прокси в Приложении XerSon Работа с сетью в Delphi 4 22.09.2008 17:30
Звук в приложении Артэс Win Api 1 31.05.2008 20:52
Закрытие формы MDIChild в MDI приложении Avalonix Общие вопросы Delphi 4 29.05.2008 16:45
Открытие файлов в MDI-приложении Eofol Общие вопросы Delphi 2 20.12.2007 22:05
музончик в приложении krem Общие вопросы Delphi 1 25.07.2007 14:53