Russian Qt Forum

Qt => Общие вопросы => Тема начата: serg_hd от Февраль 22, 2010, 18:13



Название: QTimer и QThread. Можно ли подружить?
Отправлено: serg_hd от Февраль 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()."". Как это осуществить? Спасиб ответившим.


Название: Re: QTimer и QThread. Можно ли подружить?
Отправлено: BRE от Февраль 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";
}
 


Название: Re: QTimer и QThread. Можно ли подружить?
Отправлено: serg_hd от Февраль 22, 2010, 18:23
В Jambi это, видимо, не так просто. Например у кого вызвать метод exec()??... Просто так его там не напишешь и QThread.exec() - нет такого.


Название: Re: QTimer и QThread. Можно ли подружить?
Отправлено: BRE от Февраль 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();
        }
    }



Название: Re: QTimer и QThread. Можно ли подружить?
Отправлено: serg_hd от Февраль 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();
        }
    }


Премного благодарен.


Название: Re: QTimer и QThread. Можно ли подружить?
Отправлено: Edynchik от Ноябрь 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 срабатывает...


Название: Re: QTimer и QThread. Можно ли подружить?
Отправлено: RedDog от Ноябрь 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 мс?


Название: Re: QTimer и QThread. Можно ли подружить?
Отправлено: Edynchik от Ноябрь 22, 2011, 12:31
ну получается так, ведь точка останова в func1 ,определенный в классе Thread, срабатывает, а в func2 ,определенный в классе Thread, не срабатывает...или я что то не так понимаю...
 
притом не очень понятно почему так происходит...если оставить только таймер связанный с func2,а func1 удалить..то ситуация не меняется...


Название: Re: QTimer и QThread. Можно ли подружить?
Отправлено: LisandreL от Ноябрь 22, 2011, 13:57
А event loop-то у вас где?


Название: Re: QTimer и QThread. Можно ли подружить?
Отправлено: Edynchik от Ноябрь 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();
}
 


Название: Re: QTimer и QThread. Можно ли подружить?
Отправлено: LisandreL от Ноябрь 22, 2011, 14:24
ну я в конец run вставил exec(). А про event loop от вас узнал.
Exec достаточно. Он через тот же event loop работает. Покажите что функции делают, а так же как создаётся, запускается, останавливается и уничтожается поток.
Exec надо после стартов таймеро делать, а никак не до.


Название: Re: QTimer и QThread. Можно ли подружить?
Отправлено: Edynchik от Ноябрь 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;
}
 


Название: Re: QTimer и QThread. Можно ли подружить?
Отправлено: LisandreL от Ноябрь 22, 2011, 15:05
А как вы определяете, что в функцию f2 оно не заходит, если там ни строчки, а только возвращение значения, которое никуда не присваивается?


Название: Re: QTimer и QThread. Можно ли подружить?
Отправлено: Edynchik от Ноябрь 22, 2011, 15:12
ну ставлю точку останова на return...даже если добавить какое либо присвоение,дело то это не меняет...