1

我想制作一个停止主线程并重新启动的函数,它会在几秒钟后重新启动它。我尝试了以下方法:

void Mainwindow::timeout()
{
    QTimer timer;
    timer.setSingleShot(true);
    timer.setInterval(time*1000);
    connect(&timer,SIGNAL(timeout()),MainWindow::thread(),SLOT(start()));

    timer.start();

    SuspendThread(MainWindow::thread());
}

不幸的是,这并没有做很多...任何提示?

4

3 回答 3

3

您的计时器对象在Mainwindow::timeout()函数结束时被销毁,因此它永远不会发出timeout()信号。

于 2013-02-06T14:41:22.437 回答
3

也许我忽略了一些东西,但是“停止 [...] 并在几秒钟后重新启动的功能”sleep()对我来说听起来很像。让操作系统进行计时,而不是重新发明轮子。

或者有什么原因你不能在主线程中发布一些消息?在这个简单的用例中,甚至可能通过单个互斥体就足够了。从另一个线程设置互斥锁,在主线程事件循环中检查它并可能sleep()直接调用。

这也简化了调试,因为您只有一个位置,主线程将自愿进入休眠状态,而不是被其他线程动态挂起。

于 2013-02-06T14:53:54.740 回答
2

我不确定你为什么要停止事件循环,但你可以通过等待锁定的互斥锁 x 毫秒来让你的线程休眠。

在下面的代码中,您将使用waitCondition.wait(&mutex, msecs);等待条件变量的最大msecs毫秒数。由于互斥锁被锁定,因为没有另一个线程会发送唤醒信号,这将阻塞你的线程timeout几毫秒。参考在这里

#include <QWaitCondition>
#include <QMutex>

class Sleep
{
public:
    static void msleep(unsigned long msecs)
    {
        QMutex mutex;
        mutex.lock();

        QWaitCondition waitCondition;
        waitCondition.wait(&mutex, msecs);

        mutex.unlock(); // Not necessary since new mutex will always be created,
                        // but since destroying locked mutex
                        // is bringing undefined behavior, let's follow some ethics 
    }
};
于 2013-02-06T14:11:02.350 回答