Multithreading 在qt中挂起主线程
我想做一个函数,停止主线程并在几秒钟后重新启动它。我尝试了以下方法:Multithreading 在qt中挂起主线程,multithreading,qt,suspend,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();
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());
}
不幸的是,这没什么用。。。有什么提示吗?我不知道为什么要停止事件循环,但可以通过在锁定的互斥锁上等待x毫秒来休眠线程 在下面的代码中,您将使用waitCondition.wait&mutex,毫秒;等待条件变量的最大毫秒数(毫秒)。由于互斥锁是锁定的,因为没有另一个线程会发送唤醒信号,这将阻止线程超时毫秒。参考文献是
我不知道为什么要停止事件循环,但可以通过在锁定的互斥锁上等待x毫秒来休眠线程 在下面的代码中,您将使用waitCondition.wait&mutex,毫秒;等待条件变量的最大毫秒数(毫秒)。由于互斥锁是锁定的,因为没有另一个线程会发送唤醒信号,这将阻止线程超时毫秒。参考文献是
您的计时器对象在Mainwindow::timeout函数结束时被销毁,所以它永远不会发出超时信号。您的计时器对象在Mainwindow::timeout函数结束时被销毁,所以它永远不会发出超时信号。也许我忽略了什么,但一个停止的函数[…]几秒钟后重新启动对我来说像是在睡觉。让操作系统来计时,而不是重新发明轮子 或者你有什么理由不能在主线程上发布一些消息?在这个简单的用例中,甚至通过一个互斥就足够了。从另一个线程设置互斥体,在主线程事件循环中检查它,并可能直接调用sleep
这也简化了调试,因为您只有一个位置,主线程将自动休眠,而不是被其他线程挂起。也许我忽略了什么,但是一个停止[…]并在几秒钟后重新启动的函数对我来说听起来像是休眠。让操作系统来计时,而不是重新发明轮子 或者你有什么理由不能在主线程上发布一些消息?在这个简单的用例中,甚至通过一个互斥就足够了。从另一个线程设置互斥体,在主线程事件循环中检查它,并可能直接调用sleep
这也简化了调试,因为只有一个地方,主线程将自动休眠,而不是被其他线程挂起。此外,如果阻止主线程而不返回事件循环,计时器超时也不会被触发。此外,如果阻止主线程而不返回事件循环,计时器超时不会被触发。为什么?UI编程的第一条规则:永远不要阻塞UI线程,为什么?UI编程的第一条规则:永远不要阻塞UI线程,因为我不太习惯qt线程处理,所以可能我忽略了一些东西。但是,您的方法是否总是阻止调用线程,或者换一种方式:语义上是睡眠调用?OP询问如何阻止另一个线程。@MarcusRiemer是的,这在语义上是一个睡眠呼叫。不幸的是,我没有看到OP要求阻止另一个线程-为什么你认为他想阻止另一个线程?谢谢我不知道。。。看看这个问题的第一条评论,似乎有很多人不确定OP到底想要实现什么。我同意-所以,你的答案是+1:。我不太习惯qt线程处理,所以可能我忽略了一些东西。但是,您的方法是否总是阻止调用线程,或者换一种方式:语义上是睡眠调用?OP询问如何阻止另一个线程。@MarcusRiemer是的,这在语义上是一个睡眠呼叫。不幸的是,我没有看到OP要求阻止另一个线程-为什么你认为他想阻止另一个线程?谢谢我不知道。。。看看对这个问题的第一条评论,似乎有很多人不确定OP到底想要实现什么。我同意-所以,你的答案是+1:。
#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
}
};