Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Qt и кроссплатформенное программирование С/С++
Регистрация

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



Ответ
 
Опции темы
Старый 25.07.2017, 12:02   #1
Xuch
Пользователь
 
Регистрация: 25.03.2013
Сообщений: 36
Репутация: 10
Вопрос Проблема в подгрузкой картинок в QT

Всем доброго времени суток!
Ситуация такая: у меня есть 4шт. QLabel, на которых я отображаю QPixmap, который получаю из QImage, который в свою очередь получает изображение из сырого буфера данных. Плюс ко всему этому поверх этих картинок иногда отображается меню, в котором подсвечивается текущий выбранный элемент (меню перебора).

В моем главном GUI-классе Draw я сделал таймер с интервалом 10мс, в обработчике которого проверяю есть ли новые картинки для 4шт. QLabel и отображаю меню.

Проблема в том, что меню ощутимо тормозит если выводить картинки на 4шт. QLabel. Если делаю на 1шт., то в принципе нормально.

Я подозреваю, что задержка возникает при подгрузке QImage из буфера данных и потом преобразование QImage в QPixmap также занимает много ресурсов.

Делаю я это так:
Код:

const QPixmap& Img = QPixmap::fromImage(QImage(data, SizePair.x, SizePair.y, QImage::Format_RGB888).mirrored(true, false));
Label[i]->setPixmap(Img);

В связи с этим вопрос: можно ли подгрузку QImage из буфера данных и преобразование QImage в QPixmap для этих четырех QLabel сделать в отдельных 4-х потоках, которые бы по завершению преобразований как-то сообщали в основной QUI-класс Draw о факте готовности QPixmap, передавали ее и завершали бы свой поток до следующей картинки? Возможен ли такой вариант?
Xuch вне форума   Ответить с цитированием
Старый 25.07.2017, 16:00   #2
alexzk
Участник клуба
 
Регистрация: 12.04.2017
Сообщений: 616
Репутация: 145
По умолчанию

Убедитесь, что QPixmap создается в ГУИ потоке. Если его создавать в любом другом - будут чудные баги.

Вот пример кешера картинок

https://github.com/alexzk1/astroed/tree/master/memimage


Я его запускаю в потоке, он грузит файлы. А превью их по мере читает.

Последний раз редактировалось alexzk; 25.07.2017 в 16:04.
alexzk вне форума   Ответить с цитированием
Старый 25.07.2017, 18:17   #3
Xuch
Пользователь
 
Регистрация: 25.03.2013
Сообщений: 36
Репутация: 10
По умолчанию

У меня сейчас всё в одном потоке, включая и QPixmap. Я вот и хотел как раз разделить - обработку в отдельных потоках, а присваивать QPixmap на QLabel в основном GUI, но как это организовать пока не понимаю - в QT очень замудренные потоки, все запутанно...
Xuch вне форума   Ответить с цитированием
Старый 26.07.2017, 13:33   #4
alexzk
Участник клуба
 
Регистрация: 12.04.2017
Сообщений: 616
Репутация: 145
По умолчанию

Да не нужны те потоки замудреные, вполне пойдет std::thread. У QThread есть дополнительный цикл обработки сообщений, но он нужен только, если вы собрались ПРИНИМАТЬ сигнал. Для emit signal (или вообще без них) сойдет стандартный.
alexzk вне форума   Ответить с цитированием
Старый 27.07.2017, 11:09   #5
Xuch
Пользователь
 
Регистрация: 25.03.2013
Сообщений: 36
Репутация: 10
По умолчанию

Я в свое время обнаружил, что QT не уживается с pthread, поэтому и стал смотреть в сторону родных QT-шных потоков. Вопрос как с std::thread - не будет ли каких-то конфликтов или подводных камней?
Xuch вне форума   Ответить с цитированием
Старый 27.07.2017, 13:55   #6
alexzk
Участник клуба
 
Регистрация: 12.04.2017
Сообщений: 616
Репутация: 145
По умолчанию

Не замечал, кт 5.6 - 5.9, собираю линукс-мак.
...там другая засада будет, например, стек на линуксе у потока 8мб, а на маке 512кб. При сильной загрузке стека объектами - будут непонятный вылеты (в аллокаторах). Так что, мне вообще потом пришлось на буст перейти (в нем можно при создании размер стека задать, сохраняя std::thread стиль).

...а вот про винды ничего не знаю. Скорее всего, нужно собирать с помощью g++,а не визуалки, тогда там везде pthread.

....вообще, повспоминал, при написании многоплатформеного кода, там действительно нужно внимательно выставлять ключи компилятора, в частности - какие потоки линковать. Но, это не отменяет сути, С++ код остается все тем же - решает компилер/линкер. И вот там, главное не включить 2 вида потоков. Это касается и библиотек, например, либа может быть собрана без pthread,а программа "С" (причем, скажем, в обоих в коде std::thread) - вот вам и конфликт.

Последний раз редактировалось alexzk; 27.07.2017 в 14:28.
alexzk вне форума   Ответить с цитированием
Старый 28.07.2017, 15:55   #7
Xuch
Пользователь
 
Регистрация: 25.03.2013
Сообщений: 36
Репутация: 10
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
**** например, либа может быть собрана без pthread,а программа "С" (причем, скажем, в обоих в коде std::thread) - вот вам и конфликт.
Не совсем понял последнюю фразу - что имелось в виду конкретно
Xuch вне форума   Ответить с цитированием
Старый 28.07.2017, 21:51   #8
alexzk
Участник клуба
 
Регистрация: 12.04.2017
Сообщений: 616
Репутация: 145
По умолчанию

Цитата:
Сообщение от Xuch Посмотреть сообщение
Не совсем понял последнюю фразу - что имелось в виду конкретно
std::thread не означает автоматически использование pthread, это уже будет решено на этапе компиляции. Так вот у виндовс есть 2 варианта - pthread и ее родное. Т.е. любая самостоятельно компилируемая программа или либа может использовать 1 из двух.

Далее вы писали - оно конфликтует, не знаю не видел, но привел вариант, как можно получить 2 разных варианта в 1 программе.
alexzk вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi 7. как решить проблему с подгрузкой картинок BOOGFud Помощь студентам 2 17.03.2012 00:45
Проблема с выводом картинок pufystyj Gamedev - cоздание и обсуждение игр 1 29.07.2011 07:28
Проблема с увеличением картинок Napste® JavaScript, Ajax 0 02.06.2010 18:53
Проблема с подгрузкой WinHTTP.dll motorway Microsoft Office Excel 1 29.07.2009 00:30
Проблема с прогрузкой картинок. Wuf HTML и CSS 7 04.12.2008 17:50




08:21.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru