让QtConcurrent中的QTimer正常工作

时间:2017-07-02 05:59:01

标签: c++ multithreading qt

我正在尝试让QTimer工作,并在单独的线程中运行时发出适当的信号。我不知道应该怎样做以便发出timeout()信号。

当我尝试使用QFutureQFutureWatcher时,他们不会抛出他们的finished()信号,因为这个线程永远不会真正结束,它只会保持循环。

我已查看了其他一些问题12345无效。

这就是我现在拥有的。任何建议将不胜感激!

Foo.cpp中

Foo::Foo() {
    ...
    mcTimerForSpoilers = new QTimer(this);
    connect(mcTimerForSpoilers, SIGNAL(timeout()), this, SLOT(queueDownloadOfSpoilerFile()), Qt::QueuedConnection);
    QtConcurrent::run(this, &Foo::manageSpoilerTimer);
}

void Foo::manageSpoilerTimer() {
    ...
    mcTimerForSpoilers->setInterval(5000); // 5 seconds
    mcTimerForSpoilers->start();
}

void Foo::queueDownloadOfSpoilerFile() {
    ...
    std::cerr << "Queue Download" << std::endl;
    manageSpoilerTimer(); // Restart the timer
}

1 个答案:

答案 0 :(得分:2)

你的设计错了。您可以调用QtConcurrent::run(this, &Foo::manageSpoilerTimer);,但只能从自己的线程启动计时器。

此外,你没有指定一个间隔,所以定时器会持续发射,但是每次超时都会继续启动定时器。

目前尚不清楚你真正想做什么。看起来你不知道自己在做什么。

我不认为QtConcurrent是开始下载的好选择。它不支持进度跟踪,暂停或取消,这些都是下载内容应该使用的功能。您应该选择基于QObject的线程化工作者,如this answer中所述。