我想创建一个停止主线程的函数,并在几秒钟后重新启动它。我尝试了以下方法:
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());
}
不幸的是,这并没有做很多...任何提示?
答案 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
}
};