Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Maksim от Август 17, 2010, 11:48



Название: Анимация с помощью QTimer тормозит
Отправлено: Maksim от Август 17, 2010, 11:48
Всем Болшой Привет!

Сломал себе уже голову, но решения просто не нахожу...
( Читал все другие темы по вопросам QThread и QTimer. Переносил свой таймер в другой thread. С "event loop" без него...нех** не работает ... :-[ )

Задачка в принципе проста (или всё же нет?!?!  ::) ).
Сделал некий виджет с отрисовкой анимации:
 
(http://img525.imageshack.us/img525/6669/qwaitwidget.png)

Перерисовка запускаетса с помощью QTimer. Всё красиво хорошо.
Стоит поднопряч главний поток - отрисовка тормозит.

Внимание вопрос: Как избавитса от тормозов?!?!??!?!??!?!

П.С:
исходники прилогаю


Название: Re: Анимация с помощью QTimer тормозит
Отправлено: BRE от Август 17, 2010, 11:59
Ну так не поднапрягай главный поток.  :)
Напрягай другие, запустив свой слот, ты полностью остановил всю работу главного потока, вместе с циклом обработки событий.


Название: Re: Анимация с помощью QTimer тормозит
Отправлено: BRE от Август 17, 2010, 12:25
Ето просто не реално переписать всю программу из за одного сра**** окна.... не ужели нет вариантов?!?!?  :'(
Что значит переписать всю программу.
Всю "тяжелую" работу перенеси в отдельный поток (создай еще один класс) и запускай его в твоем слоте.
Ничего фатального здесь нет.

Ну а если лень все переписывать, то добавь в долгий цикл вызов:
QApplication::processEvents();


Название: Re: Анимация с помощью QTimer тормозит
Отправлено: Maksim от Август 17, 2010, 13:04
@BRE : You are my hero for today!!!!!!! :-)

Спасиба, работает!!!!!!!!!!!!!!!!!  :)



Название: Re: Анимация с помощью QTimer тормозит
Отправлено: fuCtor от Август 17, 2010, 13:47
Почитайте про QtConcurrent, если не хотите заморачиваться с потоками ;)


Название: Re: Анимация с помощью QTimer тормозит
Отправлено: niXman от Август 17, 2010, 20:15
попробуй "QTimer::singleShot(1, sender, SLOT(slotname()))"


Название: Re: Анимация с помощью QTimer тормозит
Отправлено: BRE от Август 17, 2010, 20:37
Для чего использовать синхронные запросы?
Поток создается после вызова метода QThread::start() и начинает выполняться после передачи ему управления.

Проще подробно рассказать, что ты хочешь сделать и думаю решение быстро найдется.  ;)


Название: Re: Анимация с помощью QTimer тормозит
Отправлено: Maksim от Август 18, 2010, 13:33
Привет Всем!

Задачу решил! Кому интерессно решение выглядит (примерно) так:

Код:
//-----------------------------------------------------------------
bool MyClient::executeServerRequest(const XmlRpcValue &inParam, XmlRpcValue &outResult)
{
  //protection. this piece of code schould run only once a time
  QMutexLocker locker(&m_Mutex);

  bool bResult=true;

  //show wait animation as long as we proceed the request
  m_pWaitWidget->show();
 
  //retrieve data from server in thread
  QionXmlRpcThread callThread(inParam,outResult);
  callThread.start();

  //proceed events to keep wait animation going
  while(callThread.isRunning())
    //callThread don't begin to work till first call of QApplication::processEvents
    QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);

  //destroy thread
  callThread.terminate();
  callThread.wait();

  //hide wait animation
  m_pWaitWidget->hide();

  return bResult;
}


Название: Re: Анимация с помощью QTimer тормозит
Отправлено: Igors от Август 18, 2010, 15:31
Код:
  //proceed events to keep wait animation going
  while(callThread.isRunning())
    //callThread don't begin to work till first call of QApplication::processEvents
    QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
Так пользователь никак не сможет прервать callThread. Плюс грузите главную нитку без нужды


Название: Re: Анимация с помощью QTimer тормозит
Отправлено: Maksim от Август 18, 2010, 17:41
Так пользователь никак не сможет прервать callThread. Плюс грузите главную нитку без нужды

Ползователь и не должен callThread прерывать. Ето будет равноправно ошибке в запросе к серверу.

Загружать главную нить приходитса, посколку сервер не поддерживает многопоточность.

Клиент заппосил данные от сервера и будет ждать пока тот не ответит. Раньше программа на етом месте замерзала, окна не отрисовивались - теперь всё как нужно :-)


Название: Re: Анимация с помощью QTimer тормозит
Отправлено: fuCtor от Август 19, 2010, 19:50
http://doc.trolltech.com/4.6/qtconcurrentrun.html#run
+
http://doc.trolltech.com/4.6/qfuture.html
+
http://doc.trolltech.com/4.6/qfuturewatcher.html

То что доктор прописал.
Через run пускаете запрос к серверу. На qfuturewatcher вешаете при старет блокировать компоненты или взводить флаги, а при завершении  востанавливать и получать результат выполнения действия. Таким образом основной поток не блокируется, нет активного ожидания (ЗЛО) и все псевдоасинхронно.