Поиск:

Ответ в темуСоздание новой темы Создание опроса
> совет по QThread 
V
    Опции темы
vlarry
Дата 1.4.2011, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



Добрый день, форумчане! Хотел бы попросить у Вас совета, как правильно решить следующую задачу: есть qmainwindow на котором расположена сцена QGraphicsScene. На сцену выводится видео через phonon и бегущая строка(QLabel). И конечно все это тормозит . Подскажите пожалуйста, как реализовать, чтобы бегущая строка работала в другом потоке и не было тормозов...заранее спасибо.
PM MAIL   Вверх
borisbn
Дата 1.4.2011, 17:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



рисовать, да и вообще хоть как-то использовать GUI из другого потока нельзя.
в другом потоке можно подготавливать данные для отрисовки, например для видеопроигрывателя - проводить чтение из файла и декодировать, а затем отправлять в сигнале сформированную картинку основному потоку.
посмотри, что именно тормозит и попробуй это ускорить.
отключи бегущую строку. если ничего не изменится, то это не она.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
vlarry
Дата 1.4.2011, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



запускал видео без бегущей строки, то тормозов нет, а когда подключаю назад, то начинает тормозить...выставил задержку 5мс для бегущей строки, а двигается с задержкой где-то 500мс...что можете посоветовать в таком случае?


PM MAIL   Вверх
Alca
Дата 1.4.2011, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



На WinAPI это делается асинхронной посылкой сообщения главному потоку (::PostMessage), который и делает нужную работу (рисует).

Это сообщение отредактировал(а) Alca - 1.4.2011, 18:06


--------------------
PM WWW ICQ Skype Jabber   Вверх
vlarry
Дата 1.4.2011, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



Спасибо. К сожалению мне нужно на qt... Какие еще варианты есть?
PM MAIL   Вверх
Alca
Дата 1.4.2011, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



 smile принцип тот же


--------------------
PM WWW ICQ Skype Jabber   Вверх
vlarry
Дата 1.4.2011, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



мне кажется все равно будет тормозить...тормоза происходят при отрисовке или я ошибаюсь? расчетов там очень малоsmile...
PM MAIL   Вверх
borisbn
Дата 1.4.2011, 22:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(Alca @  1.4.2011,  18:05 Найти цитируемый пост)
На WinAPI это делается асинхронной посылкой сообщения главному потоку (::PostMessage)

Цитата(borisbn @  1.4.2011,  17:50 Найти цитируемый пост)
а затем отправлять в сигнале сформированную картинку основному потоку

это одно и то же

Цитата(vlarry @  1.4.2011,  17:55 Найти цитируемый пост)
начинает тормозить...выставил задержку 5мс для бегущей строки, а двигается с задержкой где-то 500мс...что можете посоветовать в таком случае?

ну... как минимум для советов нужно знать как у тебя всё сделано. нет ?

Цитата(vlarry @  1.4.2011,  21:40 Найти цитируемый пост)
тормоза происходят при отрисовке

если ты не пытаешься получить 100 fps используя QPainter, то драйвера видеокарты должны справиться без проблем.

в общем, без знания структуры твоей программы, что она и как делает, подсказать что-либо конкретное IMHO проблемотично.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
vlarry
Дата 2.4.2011, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



Потоки я пока не создавал, потому и спрашиваю совета...не могу понять как и где делать...
вот код mainwindow, где и реализуется наложение текста бегущей строки на видео...класс бегущей строки могу тоже выложить, если надо...
Код

#include "../header/mainwindow.h"
//--------------------------------------------------------------------
MainWindow::MainWindow(QMainWindow *parent): QMainWindow(parent)
{
    QTextCodec *codec = QTextCodec::codecForName("cp1251");
    QTextCodec::setCodecForTr(codec);

    // инициализация переменных
    m_player      = new Phonon::VideoPlayer(Phonon::VideoCategory);
    m_viewPlayer  = new QGraphicsView;
    m_scenePlayer = new QGraphicsScene;
    m_lblText     = new RunStr("Бегущая строка");

    // подключение виджетов проигрывателя и надписи к сцене
    m_proxyPlayer = m_scenePlayer->addWidget(m_player);
    m_proxyText   = m_scenePlayer->addWidget(m_lblText);
    
    // настройка элементов
    m_scenePlayer->setSceneRect(m_viewPlayer->rect());
    this->showFullScreen();                       // установка в полноэкранный режим
    m_proxyPlayer->setPos(0.0, 0.0);
    //m_proxyText->setPos(0.0, 0.0);
    m_lblText->setFontStr(QFont("Arial Black", 30, 30));
    m_lblText->setColor(QColor(Qt::red));
    m_lblText->setSize(m_player->size());
    m_lblText->run();
    
    m_viewPlayer->setBackgroundBrush(QBrush(Qt::black)); // установка черного фона

    m_viewPlayer->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);  // отключение
    m_viewPlayer->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // scrollbar-ов
    
    // масштабирование видео на весь экран
    QSize size_wnd  = this->size();                // получаем размеры экрана
    QSize size_view = m_viewPlayer->size();       // получаем размеры вида

    double xscale = (double)size_wnd.width()/size_view.width();   // получаем коэффициенты
    double yscale = (double)size_wnd.height()/size_view.height(); // масштабирования

    m_viewPlayer->scale(xscale, yscale); // масштабирование видео

    m_viewPlayer->setScene(m_scenePlayer);               // привязка сцены к виду
    
    // подключения формы к главному окну
    this->setCentralWidget(m_viewPlayer);

    m_videoFileName = tr("Рисование на воде.avi");
    m_player->play(m_videoFileName);
}

без включения видео при задержке в 30 мс строка перемещается плавно...а все вместе не хочет
PM MAIL   Вверх
borisbn
Дата 2.4.2011, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(borisbn @  1.4.2011,  22:45 Найти цитируемый пост)
если ты не пытаешься получить 100 fps используя QPainter

Цитата(vlarry @  1.4.2011,  17:55 Найти цитируемый пост)
выставил задержку 5мс для бегущей строки

я так и думал. даже в два раза ошибся.
Есть подозрение, что тормозит отрисовка бегущей строки именно на QGraphicsScene, в котором ещё и видеоплеер крутится...
Попробуй для начала разместить строку не в сцене, а просто на MainWidget'е в вертикальном layout'е с сценой...
Затем можно попробовать в качестве объекта, на котором должен рисовать плеер выбрать просто QWidget, а ещё лучше QGLWidget.
Также можно попробовать бегущую строку наследовать от QGLWidget.
В общем, IMHO, какая-то оч. сложная у тебя компоновка...
А потоки в данном случае скорее всего ( 99% ) не только не помогут, но ещё и замедлят работу. У тебя нет рассчётов, которые требуется выносить в отдельный поток.

P.S.
Цитата(vlarry @  2.4.2011,  07:50 Найти цитируемый пост)
QTextCodec::setCodecForTr(codec);

Цитата(vlarry @  2.4.2011,  07:50 Найти цитируемый пост)
 m_lblText     = new RunStr("Бегущая строка");

Цитата(vlarry @  2.4.2011,  07:50 Найти цитируемый пост)
 m_videoFileName = tr("Рисование на воде.avi");

Прикольно... получается, что текст на экране у тебя железно русский, а имя файла avi - в завасимости от языка smile



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
vlarry
Дата 2.4.2011, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



borisbn, спасибо большое за советы. Так и попробую сделать, а потом отпишусь
Цитата(borisbn @  2.4.2011,  10:18 Найти цитируемый пост)
m_lblText     = new RunStr("Бегущая строка");

а здесь просто в классе RunStr переводится через tr()smile

PM MAIL   Вверх
vlarry
Дата 4.4.2011, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



дабы не создавать много новых тем, решил продолжить здесь. От потоков отказался, тем более что мне сказали, что ничего не выйдет. Пробую сей час так...Создал QStackedLayout и добавил виджеты: видеоплеер и бегущую строку. Поставил режим для лайоута
Код

stLt->setStackingMode(QStackedLayout::StackAll);

но происходит что-то странное: экран становится черным, но видео не идет(только звук), а бегущая строка идет сплошной полосой, т.е. оставляет за собой след. Что это может быть и как от этого избавиться?
PM MAIL   Вверх
_GRIN_
Дата 4.4.2011, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



vlarry, я бы сделал следующим образом
Код

#include "../header/mainwindow.h"
//--------------------------------------------------------------------
MainWindow::MainWindow(QMainWindow *parent): QMainWindow(parent)
{
    //QTextCodec *codec = QTextCodec::setCodecForTr ("cp1251");
    //QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("cp1251"));

    // инициализация переменных
    m_player      = new Phonon::VideoPlayer(Phonon::VideoCategory);
    m_viewPlayer  = new QGraphicsView;
    m_scenePlayer = new QGraphicsScene;
    //m_lblText     = new RunStr("Бегущая строка");
    m_lblText     = new RunStr(tr("Бегущая строка"));
    // подключение виджетов проигрывателя и надписи к сцене
    m_proxyPlayer = m_scenePlayer->addWidget(m_player);
    //m_proxyText   = m_scenePlayer->addWidget(m_lblText);
    
    // настройка элементов
    m_scenePlayer->setSceneRect(m_viewPlayer->rect());
    // отображать надо после того, как все настройки закончены =)
    //this->showFullScreen();                       // установка в полноэкранный режим
    m_proxyPlayer->setPos(0.0, 0.0);
    //m_proxyText->setPos(0.0, 0.0);
    m_lblText->setFontStr(QFont("Arial Black", 30, 30));
    m_lblText->setColor(QColor(Qt::red));
    m_lblText->setSize(m_player->size());
    // отображать надо после того, как все настройки закончены =)
    //m_lblText->run();
    
    m_viewPlayer->setBackgroundBrush(QBrush(Qt::black)); // установка черного фона
    m_viewPlayer->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);  // отключение
    m_viewPlayer->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // scrollbar-ов
    
    // Масштабировать в констукторе бесполезно - надо перезагружать resizeEvent() и масштабировать в нём
    //// масштабирование видео на весь экран
    //QSize size_wnd  = this->size();                // получаем размеры экрана
    //QSize size_view = m_viewPlayer->size();       // получаем размеры вида
    //double xscale = (double)size_wnd.width()/size_view.width();   // получаем коэффициенты
    //double yscale = (double)size_wnd.height()/size_view.height(); // масштабирования
    //m_viewPlayer->scale(xscale, yscale); // масштабирование видео
    //m_viewPlayer->setScene(m_scenePlayer);               // привязка сцены к виду
    
    // подключения формы к главному окну
    //this->setCentralWidget(m_viewPlayer); //лишняя работа для график-сцены
    setCentralWidget(new QWidget)
    QVBoxLayout*v_layout = new QVBoxLayout(centralWidget());
    v_layout->addWidget(m_viewPlayer);
    v_layout->addWidget(m_lblText);
    m_videoFileName = tr("Рисование на воде.avi"); //русские имена файлов - плохо переносимый код - плохой стиль
    m_player->play(m_videoFileName);
    //начинаем отрисовку
    m_lblText->run();
    showFullScreen(); //вообще отображать лучше не из конструтора, а из вне, например из main()
}



Это сообщение отредактировал(а) _GRIN_ - 4.4.2011, 11:58


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
vlarry
Дата 4.4.2011, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



GRIN, спасибо, но в данном случае видео не идет, только звук, и бегущая строка не на видео, а под ним...а мне надо именно на видео наложить....может использовать какие-то сторонние библиотеки, если да, то какие?
PM MAIL   Вверх
_GRIN_
Дата 4.4.2011, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



vlarry,  опять же - перегрузи resizeEvent() 
Код

void MainWindow::resizeEvent(QResizeEvent*ev)
{
    QMainWindow::resizeEvent(); //обычный обработчик
    QRect r;
    //теперь можно вычислять координаты, по которым надо строку расположить
    m_lbl_text->setGeometry(r);
}

Есть одно но, строка должна добавляться в MainWindow->layout() последней, точнее она должна быть последней в списке его чайлдов, тогда она будет отрисовываться поверх плеера.

З.Ы. Я к сожалению не знаю точной реализации график-сцены, но судя по описанной тобой ситуации, перерисовка чайлда сцены (бегущей строки) задейтвует какие-то механизмы самой сцены - доп.расчёты видимо. Вывод - надо убрать строку из сцены (если не поможет, то тогда я бы под профайлером запустил - что бы узнать что именно больше всего времени в гуи-потоке занимает)



--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0558 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.