QTimer, созданный ранее, но запущенный позже, не работал - PullRequest
0 голосов
/ 15 апреля 2019

Код находится на C ++ / Qt. По сути, я хотел создать таймер (но не запустил) и запустить его позже, когда это необходимо. Но это не сработало. Если я сразу же создал и запустил таймер, он работал как положено. Идея кода выглядит следующим образом:

mytimer.cpp:

#include "mytimer.h"
#include <QtCore>
MyTimer::MyTimer()
{
    timer = new QTimer(this); 
    connect(timer,SIGNAL(timeout()),this,SLOT(mySlot()));
    //    timer->start(1000);    
}

void MyTimer::mySlot()
{
    qDebug()<<"timer executed";
}


MyTimer::startTimer(void)
{
   timer->start(1000);
}

Примечание: startTimer() запускается из другого потока с сигналом. Я отладил код, и функция startTimer() была вызвана, как и ожидалось, но таймер НЕ запустился.

А в main.cpp :

#include <QApplication>
#include "mytimer.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MyTimer mtimer;
    qDebug()<<"DONE";

    return a.exec();
}

Не знаю, почему я не смог запустить таймер позже.

1 Ответ

0 голосов
/ 16 апреля 2019

Это основная проблема: «Примечание: startTimer () запускается из другого потока с сигналом». Однако вы создаете экземпляр MyTimer в главном потоке, который отличается, поскольку вы пытаетесь запустить таймер в другом потоке. Вы должны либо создать свой таймер в потоке, для которого нужно активировать тайм-аут, либо переместить таймер в этот поток, а затем подключить свой таймер к тайм-ауту и ​​слоту. Например, вы можете сделать это, может быть (не проверено, будет ли это действительно работать):

MyTimer::startTimer(void)
{
   timer->moveToThread(QThread::currentThread());
   connect(timer, &QTimer::timeout, this, &MyTimer::mySlot);
   timer->start(1000);
}

Однако я бы предложил следующий подход, поскольку перемещение объектов между потоками может привести к путанице в вашем коде, усложнить управление, поэтому, на мой взгляд, для решения вашей проблемы предпочтительнее самое простое решение.

MyTimer::startTimer(void)
{
   // Create your timer on the thread you want
   timer = new QTimer(this);

   // Connect signal and slot
   connect(timer, &QTimer::timeout, this, &MyTimer::mySlot);

   // Start the timer
   timer->start(1000);
}

Какой из них использовать, зависит от вас, но вы должны знать, что соединение сигналов и слотов между различными потоками не работает в Qt, и все соединения должны быть созданы в одном потоке, и действия, инициирующие эти соединения, должны также выполняться в том же потоке, где было установлено соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...