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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2017, 11:02   #1
Xuch
Пользователь
 
Регистрация: 25.03.2013
Сообщений: 36
Вопрос Проблема в подгрузкой картинок в 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, 15:00   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi 7. как решить проблему с подгрузкой картинок BOOGFud Помощь студентам 2 17.03.2012 00:45
Проблема с выводом картинок pufystyj Gamedev - cоздание игр: Unity, OpenGL, DirectX 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 16:50