在qt中挂起主线程

时间:2013-02-06 13:55:40

标签: multithreading qt suspend

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

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());
}

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

这也简化了调试,因为你只有一个地方主线程会自愿睡觉,而不是被其他线程动态地保留。

答案 2 :(得分:2)

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

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

#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 
    }
};