QTimer не запускает (запускает) тайм-аут

Я хочу использовать Qtimer для приостановки выполнения данного блока кодов, в то время как в другом потоке он делает что-то еще. Я связал таймаут потока с qeventloop quit, но проблема в том, что таймаут не вызывается. Когда происходит другой выброс, тайм-аут волшебным образом срабатывает, или если я добавляю еще одно соединение, тайм-аут тоже срабатывает. Я думаю, что что-то упускаю из виду при использовании qtimer, qeventloop и qthread. Кто-нибудь может помочь? Я извлек базовый код для тестирования и поместил его здесь:

main.cpp

#include "widget.h"
#include <QApplication>
#include "tim.h"
#include <QThread>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget *w=new Widget();
tim *t=new tim();
QThread *thread=new QThread();
t->moveToThread(thread);
thread->start();
        QThread::connect(w,SIGNAL(signalDoIt()),t,SLOT(slotDoIt()),Qt::QueuedConnection);
QThread::connect(w,SIGNAL(signalQuitTimer()),t,SLOT(slotQuitTimer()),Qt::QueuedConnection);
    QThread::connect(t,SIGNAL(signalSetText(QString)),w,SLOT(slotSetText(QString)),Qt::QueuedConnection);
w->show();
return a.exec();
}

тим.ч

#ifndef TIM_H
#define TIM_H

#include <QObject>
#include<QTimer>
#include<QTime>
#include<QEventLoop>
#include<QThread>
#include<QDebug>
class tim : public QObject
{
Q_OBJECT
public:
tim();
~tim();
signals:
void signalSetText(QString);
public slots:
void slotDoIt();
void slotQuitTimer();
void slotShowTime();
private:
QTimer *trainingTimer;
QEventLoop loopTrainingWait;
QTime time;
};

#endif // TIM_H

тим.cpp

#include "tim.h"

tim::tim()
{
qDebug()<<"constructor";
trainingTimer=new QTimer(this);
trainingTimer->setTimerType(Qt::PreciseTimer);
trainingTimer->setSingleShot(true);
QThread::connect(trainingTimer,SIGNAL(timeout()),&loopTrainingWait,SLOT(quit()));
// QThread::connect(trainingTimer,SIGNAL(timeout()),this,SLOT(slotShowTime())); //to uncomment all works, but withou this, it does not
}
void tim::slotDoIt()
{

trainingTimer->start(5000);
time.start();
loopTrainingWait.exec();
QString text(QString::number(loopTrainingWait.isRunning())+"  "+ QString::number(time.elapsed()));
qDebug()<<text;
emit signalSetText(text);

}
void tim::slotShowTime()
{
QString text(QString::number(loopTrainingWait.isRunning())+" slot "+     QString::number(time.elapsed()));
qDebug()<<text;
emit signalSetText(text);
}
void tim::slotQuitTimer()
{
if(loopTrainingWait.isRunning())
    loopTrainingWait.quit();
if(trainingTimer->isActive())
    trainingTimer->stop();
}
tim::~tim()
{

}

//интерфейс для тестирования widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = 0);
~Widget();
public slots:
void slotSetText(QString text);
signals:
void signalDoIt();
void signalQuitTimer();
private slots:
void on_pushButton_clicked();

void on_pushButton_2_clicked();

void on_pushButton_3_clicked();

private:
Ui::Widget *ui;
};

#endif // WIDGET_H

виджет.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
void Widget::slotSetText(QString text)
{
ui->label->setText(text);
}
Widget::~Widget()
{
delete ui;
}

void Widget::on_pushButton_clicked()
{
this->close();
}

void Widget::on_pushButton_2_clicked()
{
emit signalDoIt();
}

void Widget::on_pushButton_3_clicked()
{
emit signalQuitTimer();
}

person Andrej Fogelton    schedule 07.07.2015    source источник


Ответы (2)


Я столкнулся с той же проблемой, и в конце концов я написал SLOT между public и :, тогда это работает

person One Double    schedule 17.05.2016

проблема была в статическом qeventloop, делая этот динамический

loopTrainingWait=new QEventLoop(this);

с родителем это решило проблему

person Andrej Fogelton    schedule 07.07.2015