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
C++ Qt线程同步设计_C++_Multithreading_Qt_User Interface_Thread Safety - Fatal编程技术网

C++ Qt线程同步设计

C++ Qt线程同步设计,c++,multithreading,qt,user-interface,thread-safety,C++,Multithreading,Qt,User Interface,Thread Safety,我有一个设计问题,这已经困扰了我很长一段时间了。基本上,我有一个需要很长时间才能执行的功能和一个需要响应和更新的gui。当用户点击开始按钮时,long函数开始在while循环中执行,每次执行后都需要更新gui 我认为最好的方法是在while循环中运行QThread,如果用户按下start按钮,long函数将开始执行。与以下内容类似: class Application : public QThread { void run (void) { while (!mEx

我有一个设计问题,这已经困扰了我很长一段时间了。基本上,我有一个需要很长时间才能执行的功能和一个需要响应和更新的gui。当用户点击开始按钮时,long函数开始在while循环中执行,每次执行后都需要更新gui

我认为最好的方法是在while循环中运行QThread,如果用户按下start按钮,long函数将开始执行。与以下内容类似:

class Application : public QThread
{
    void run (void)
    {
        while (!mExiting)
        {
            if (StartPressed)
                LongFunction();

            // Need to update gui before
            // running long function again
        }
    }
}
我尝试使用BlockingQueuedConnection执行QMetaObject::Invoke,但是,当gui应用程序退出时,线程会被卡住,永远不会退出。我还尝试使用QMutex,但是,在等待长函数锁定并使用的互斥量时,gui会被锁定


我在想,当应用程序想要退出时,有没有办法取消BlockingQueuedConnection,或者有没有其他方法来实现这一点。

你很接近了,但你不需要从
QThread
继承。相反:

  • 将计算放入
    QObject
    中的插槽中

  • 将设置退出标志的代码放入另一个插槽(例如
    Q_slot void finish();

  • 创建对象的实例。创建
    QThread
    的实例。调用
    myObject->moveToThread(myThread)

  • 启动线程

  • 将gui信号连接到计算对象中的插槽,类似地连接计算对象中指示数据已就绪的信号

  • 要结束处理并完成线程,假设
    gui
    发送
    stop()
    信号,请设置以下连接:

  • 连接(gui、信号(stop())、myObject、插槽(finish())
    -停止计算

  • 连接(gui、信号(stop())、myObject->thread()、插槽(quit())
    -以结束线程中的事件循环

  • connect(myObject->thread(),SIGNAL(finished()),myObject->thread(),SLOT(deleteLater())
    -在
    run()方法返回时删除线程

  • 当您从myObject中获取结果后,或者至少在应用程序退出之前,仍然需要删除它

    警告:如果从gui线程和
    myObject->thread()中删除myObject,则删除myObject是错误的
    非零:您不能删除线程关联性与当前线程不同的对象。零线程关联性意味着没有线程声明该对象-在我们的例子中,当对象的线程被破坏时。然后任何线程都可以删除它

    出于同样的原因,您不能
    moveToThread
    有父对象的对象。但是,您移动的对象可以有子对象,但它本身不能有父对象