Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在qt中挂起主线程_Multithreading_Qt_Suspend - Fatal编程技术网

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