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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTimer и QThread. Можно ли подружить?  (Прочитано 17055 раз)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« : Февраль 22, 2010, 18:13 »

Хотелось бы иметь возможность запускать QTimer внутри run()'a. В доке по этому поводу пишут ""In multithreaded applications, you can use QTimer in any thread that has an event loop. To start an event loop from a non-GUI thread, use QThread::exec()."". Как это осуществить? Спасиб ответившим.
Записан

kubuntu/Win7/x64/NetBeans
BRE
Гость
« Ответ #1 : Февраль 22, 2010, 18:17 »

Код
C++ (Qt)
void MyThread::run()
{
QTimer timer;
connect( &timer, SIGNAL( timeout() ), SLOT( timerTick() ) );
timer.start( 1000 );
exec();
}
 
void MyThread::timerTick()
{
qDebug() << "tick";
}
 
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #2 : Февраль 22, 2010, 18:23 »

В Jambi это, видимо, не так просто. Например у кого вызвать метод exec()??... Просто так его там не напишешь и QThread.exec() - нет такого.
Записан

kubuntu/Win7/x64/NetBeans
BRE
Гость
« Ответ #3 : Февраль 22, 2010, 18:28 »

Вот отсюда: http://qt.nokia.com/doc/qtjambi-4.5.0_01/com/trolltech/qt/qtjambi-threads.html

Код:
    class EventLoopThread implements Runnable
    {
        @Iverride
        public void run()
        {
            QEventLoop loop = new QEventLoop();
            loop.exec();

            // Do whatever
           
            loop.exit();
        }
    }

Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #4 : Февраль 22, 2010, 18:59 »

Вот отсюда: http://qt.nokia.com/doc/qtjambi-4.5.0_01/com/trolltech/qt/qtjambi-threads.html

Код:
    class EventLoopThread implements Runnable
    {
        @Iverride
        public void run()
        {
            QEventLoop loop = new QEventLoop();
            loop.exec();

            // Do whatever
           
            loop.exit();
        }
    }


Премного благодарен.
Записан

kubuntu/Win7/x64/NetBeans
Edynchik
Гость
« Ответ #5 : Ноябрь 22, 2011, 09:42 »

скажите,при использовании двух таймеров в одном отдельном потоке, по второму таймеру не функция не отрабатывается. Почему так может быть?
Код
C
Thread::run
{
t1.start(10);
connect(&t1,SIGNAL(timeout()),this,SLOT(func1()));
t2.start(1000);
connect(&t2,SIGNAL(timeout()),this,SLOT(func2()));
}
 
в func2 точка останова не срабатывает, а в func1 срабатывает...
« Последнее редактирование: Ноябрь 22, 2011, 09:44 от Edynchik » Записан
RedDog
Гость
« Ответ #6 : Ноябрь 22, 2011, 10:42 »

скажите,при использовании двух таймеров в одном отдельном потоке, по второму таймеру не функция не отрабатывается. Почему так может быть?
Код
C
Thread::run
{
t1.start(10);
connect(&t1,SIGNAL(timeout()),this,SLOT(func1()));
t2.start(1000);
connect(&t2,SIGNAL(timeout()),this,SLOT(func2()));
}
 
в func2 точка останова не срабатывает, а в func1 срабатывает...
А сам поток еще жив через 1000 мс?
Записан
Edynchik
Гость
« Ответ #7 : Ноябрь 22, 2011, 12:31 »

ну получается так, ведь точка останова в func1 ,определенный в классе Thread, срабатывает, а в func2 ,определенный в классе Thread, не срабатывает...или я что то не так понимаю...
 
притом не очень понятно почему так происходит...если оставить только таймер связанный с func2,а func1 удалить..то ситуация не меняется...
« Последнее редактирование: Ноябрь 22, 2011, 12:52 от Edynchik » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #8 : Ноябрь 22, 2011, 13:57 »

А event loop-то у вас где?
Записан
Edynchik
Гость
« Ответ #9 : Ноябрь 22, 2011, 14:01 »

ну я в конец run вставил exec(). А про event loop от вас узнал. Поможете разобраться: что это и куда вставлять?

или в run просто вставить:
Код
C
Thread::run
{
QEventLoop loop = new QEventLoop();
loop.exec();
t1.start(10);
connect(&t1,SIGNAL(timeout()),this,SLOT(func1()));
t2.start(1000);
connect(&t2,SIGNAL(timeout()),this,SLOT(func2()));
loop.exit();
}
 
« Последнее редактирование: Ноябрь 22, 2011, 14:06 от Edynchik » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #10 : Ноябрь 22, 2011, 14:24 »

ну я в конец run вставил exec(). А про event loop от вас узнал.
Exec достаточно. Он через тот же event loop работает. Покажите что функции делают, а так же как создаётся, запускается, останавливается и уничтожается поток.
Exec надо после стартов таймеро делать, а никак не до.
Записан
Edynchik
Гость
« Ответ #11 : Ноябрь 22, 2011, 14:31 »

ну вот нечто подобное:
main.cpp
Код
C
#include <QtCore/QCoreApplication>
#include "thread.h"
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   Thread thread;
   thread.start();
 
   return a.exec();
}
thread.h
Код
C
#ifndef THREAD_H
#define THREAD_H
 
#include <QThread>
#include <QTimer>
#include <QEventLoop>
 
class Thread : public QThread
{
   Q_OBJECT
public:
   explicit Thread(QObject *parent = 0);
   void run();
 
signals:
 
public slots:
   bool f1();
   bool f2();
 
private:
   QTimer t1,t2;
 
};
 
#endif // THREAD_H
thread.cpp
Код
C
#include "thread.h"
 
Thread::Thread(QObject *parent) :
   QThread(parent)
{
}
 
void Thread::run()
{
   QEventLoop loop(this);
   t1.start(10);
   connect(&t1,SIGNAL(timeout()),this,SLOT(f1()));
   t2.start(1000);
   connect(&t2,SIGNAL(timeout()),this,SLOT(f2()));
   loop.exec();
}
 
bool Thread::f1()
{
   int x = 123;
   return true;
}
 
bool Thread::f2()
{
   int x = 123;
   return false;
}
 
« Последнее редактирование: Ноябрь 22, 2011, 15:13 от Edynchik » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #12 : Ноябрь 22, 2011, 15:05 »

А как вы определяете, что в функцию f2 оно не заходит, если там ни строчки, а только возвращение значения, которое никуда не присваивается?
Записан
Edynchik
Гость
« Ответ #13 : Ноябрь 22, 2011, 15:12 »

ну ставлю точку останова на return...даже если добавить какое либо присвоение,дело то это не меняет...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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