Russian Qt Forum
Сентябрь 30, 2024, 16:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Анимация с помощью QTimer тормозит  (Прочитано 8020 раз)
Maksim
Гость
« : Август 17, 2010, 11:48 »

Всем Болшой Привет!

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

Задачка в принципе проста (или всё же нет?!?!  Строит глазки ).
Сделал некий виджет с отрисовкой анимации:
 


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

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

П.С:
исходники прилогаю
« Последнее редактирование: Август 17, 2010, 15:21 от Maksim » Записан
BRE
Гость
« Ответ #1 : Август 17, 2010, 11:59 »

Ну так не поднапрягай главный поток.  Улыбающийся
Напрягай другие, запустив свой слот, ты полностью остановил всю работу главного потока, вместе с циклом обработки событий.
Записан
BRE
Гость
« Ответ #2 : Август 17, 2010, 12:25 »

Ето просто не реално переписать всю программу из за одного сра**** окна.... не ужели нет вариантов?!?!?  Плачущий
Что значит переписать всю программу.
Всю "тяжелую" работу перенеси в отдельный поток (создай еще один класс) и запускай его в твоем слоте.
Ничего фатального здесь нет.

Ну а если лень все переписывать, то добавь в долгий цикл вызов:
QApplication::processEvents();
« Последнее редактирование: Август 17, 2010, 12:28 от BRE » Записан
Maksim
Гость
« Ответ #3 : Август 17, 2010, 13:04 »

@BRE : You are my hero for today!!!!!!! :-)

Спасиба, работает!!!!!!!!!!!!!!!!!  Улыбающийся

Записан
fuCtor
Гость
« Ответ #4 : Август 17, 2010, 13:47 »

Почитайте про QtConcurrent, если не хотите заморачиваться с потоками Подмигивающий
Записан
niXman
Гость
« Ответ #5 : Август 17, 2010, 20:15 »

попробуй "QTimer::singleShot(1, sender, SLOT(slotname()))"
Записан
BRE
Гость
« Ответ #6 : Август 17, 2010, 20:37 »

Для чего использовать синхронные запросы?
Поток создается после вызова метода QThread::start() и начинает выполняться после передачи ему управления.

Проще подробно рассказать, что ты хочешь сделать и думаю решение быстро найдется.  Подмигивающий
Записан
Maksim
Гость
« Ответ #7 : Август 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;
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Август 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. Плюс грузите главную нитку без нужды
Записан
Maksim
Гость
« Ответ #9 : Август 18, 2010, 17:41 »

Так пользователь никак не сможет прервать callThread. Плюс грузите главную нитку без нужды

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

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

Клиент заппосил данные от сервера и будет ждать пока тот не ответит. Раньше программа на етом месте замерзала, окна не отрисовивались - теперь всё как нужно :-)
Записан
fuCtor
Гость
« Ответ #10 : Август 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 вешаете при старет блокировать компоненты или взводить флаги, а при завершении  востанавливать и получать результат выполнения действия. Таким образом основной поток не блокируется, нет активного ожидания (ЗЛО) и все псевдоасинхронно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.078 секунд. Запросов: 23.