| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Рисование из потока в Gui. Пример Mandelbrot. |
| Автор: SirFreeFrag 14.3.2011, 00:16 | ||
| День добрый. Подскажите как правильно передать подготовленное изображение в Gui поток для отрисовки. Делаю, как в примере Mandelbrot. Там сделано таким образом:
Вроде работает, но смущает следующая вещь. В Gui поток изображение передается с помощью сигнала renderedImage через объект image. Объект image объявлен и создается в методе класса потока run(), то бишь по сути являетстя локальным. Т.к сигнал из метода посылается другому (основному) потоку, то тип сигнала будет с постановкой в очередь. Мне казалось что слот updatePixmap (который обрабатывает сигнал renderedImage) может и выполнится поздней, чем закончится выполнение run(). Соответственно и объект image (т.к. это локальный объект метода run) будет уничтожен раньше, чем его обработает слот updatePixmap. Но как ни странно, вроде работает. Собственно вопрос, почему этого не происходит, или где я ошибаюсь? И как правильно и потоко-безопасно передавать постоянно обновляющееся изображение в главный поток для отрисовки. Если можно, поделитесь примерами. PS: Сори, забыл добавить в заголовок темы, что речь идет о Qt (4.7.1) |
| Автор: borisbn 14.3.2011, 00:32 | ||||
SirFreeFrag, обрати внимание, как они связывают сигнал потока со своим слотом
видишь, знака ссылки ( & ) уже нет. поэтоу, наверное, и работает. Если же убрать и в сигнале, и в слоте ссылку, а передавать объект QImage по значению, то вообще никаких проблем не будет, т.к. при emit'е сигнала создастся копия этого имаджа. Судя по всему из-за этого коннекта так и получается, но я бы не советовал так делать... и ещё... обрати внимание, что run начинается с
а выход из него будет только при разрушении объекта thread в главном окне. в общем, правильно делаешь, что обращаешь внимание на такие вещи. |
| Автор: SirFreeFrag 14.3.2011, 00:50 | ||||
| borisbn, если я правильно понял, ты имеешь виду, что image передается в данном случае не по ссылке, а по значению? Если так, то не хотелось бы, что бы лишний раз производилось копирование image при передаче его в updatePixmap. Т.к в Qt Examples это единственный пример в разделе Threading, был бы благодарен за линки на альтернативные реализации. Может есть какая-нитбудь общепринятая реализация решения данной задачи? Добавлено через 12 минут и 10 секунд
Ммм...вот этот момент я пропустил, просто в моей реализации не требовался бесконечный цикл в run(). |
| Автор: SirFreeFrag 14.3.2011, 01:25 | ||
Познавательно. Спасибо. |
| Автор: SirFreeFrag 14.3.2011, 15:44 | ||||
| Блин, вроде гуглил до создания темы, а сейчас нашел точно такой же тред http://www.linux.org.ru/forum/development/5192523 Насколько я понял из него, в данном случае при передаче image слоту все таки создается копия объекта, но за счет как раз выше упомянутого "Implict Data Sharing", накладные расходы при этом малы и копия будет уничтожена после того, как будет уничтожена последняя ссылка на нее (в данном примере, после того, как отработает слот updatePixmap). Если это так, то вопрос:
и
Эти варианты будут работать одинаково? В обоих случаях будет происходить "копирование" объекта? |
| Автор: borisbn 14.3.2011, 15:53 | ||
проверь создай вместо QImage свой объект с выводом в конструкторе и деструкторе в qDebug() соответствующей информации. Только не забудь зарегистрировать его через qRegisterMetaType |