|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.07.2007, 22:47 | #1 |
Пользователь
Регистрация: 02.07.2007
Сообщений: 23
|
TBitmap в многопоточном приложении
Есть 2 потока. Один главный, для отображения формы, второй вычислительный.
На форме находится TImage, для которого второй поток рассчитывает изображение. При явном доступе к TImage.Canvas.Pixels некоторые точки почему-то остаются белыми, даже если обрамлять в Lock/Unlock. Попробовал заполнять сначала временный TBitmap, порождаемый в вычислительном потоке, затем в функции, вызываемой через Synchronize копирую получившийся битмап с помощью TCanvas.CopyRect на TImage.Canvas главной формы. Так последнее происходит лишь с некоторой вероятностью, в большинстве случаев отображаемое содержимое не меняется. Подозреваю, грабли могут быть в инициализации и создании TBitmap. Иногда для начала загружал в него готовую картинку - тот же эффект. Может вообще нельзя обращаться к графическим элементам из других потоков?
Проекты для лучших программистов http://www.netlancer.ru
|
04.07.2007, 20:17 | #2 |
Пользователь
Регистрация: 02.07.2007
Сообщений: 23
|
Разобрался сам.
Поместил в Synchronize все функции работы с графическими объектами, в том числе и с принадлежащими TThread. Пришлось писать оболочки для Pixels, Line, OutText, поскольку в Synchronize, похоже, нельзя передавать параметры вызываемой функции. Как-то неэлегантно. Может есть ещё решения?
Проекты для лучших программистов http://www.netlancer.ru
|
05.07.2007, 09:05 | #3 |
Старожил
Регистрация: 13.12.2006
Сообщений: 3,859
|
конфликт прорисовки
попробуй использовать критическую секцию
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи |
09.07.2007, 00:34 | #4 |
Пользователь
Регистрация: 02.07.2007
Сообщений: 23
|
Как я понял, Synchronize делали через критические секции или семафоры.
В общем, если выводить по пикселям, на каждый пиксель делать Synchronize, то основной поток тормозить начинает жутко, таймер в нём не успевает отрабатывать и т.д. Сделал показ после просчёта каждой строки - с этим уже можно жить.
Проекты для лучших программистов http://www.netlancer.ru
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поддержка Прокси в Приложении | 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 |