![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
wiz29 |
![]()
Сообщение
#1
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: ![]() ![]() ![]() |
Столкнулся со следующей проблемой: имеется некая сцена которая отрисовывается в QImage imgScene. (отрисовка происходит в отдельном потоке) имеется метод для копирования изображения (копия сцены рисутеся в гуи потоке) Возникает следующий эффект http://s013.radikal.ru/i325/1012/d6/792b6748b025.png такое ощущение что картинка еще не успела появится на экране приходит следующий paint event. Вопрос, как можно синхронизировать и почему получается такой эффект (картинка не успевает дорисоваться до конца сверху вниз).
|
|
|
![]() |
BRE |
![]()
Сообщение
#2
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Вот смотри. Рабочий поток закончил формирование кадра, послал сигнал, этот сигнал положился в очередь GUI-потока, рабочий поток начал изменять картинку, в этот момент происходит переключение на GUI поток, который вызывает слот для копирования картинки, но она уже частично изменилась.
Или само рисование в рабочем потоке тоже закрывается мутексом? Одно из решений использовать в рабочем потоке двойной буферизации. Нарисовали кадр на первой картинке, отправили сигнал, переключились на вторую картинку и начали формировать следующий кадр. GUI-поток, получив сигнал о изменении, копирует себе первую готовую картинку. Рабочий поток завершил формировать следующий кадр на второй картинки, отсылает сигнал и переключается на первую, а GUI-поток копирует себе вторую картинку и все повторяется. В этом варианте тоже есть тонкий момент: если формирующий поток будет успевать формировать несколько кадров, а GUI-поток, соответственно, не будет успевать их получать. Сообщение отредактировал BRE - 2.12.2010, 16:19 |
|
|
![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 22.6.2025, 22:00 |