gpt4 book ai didi

c++ - Qt线程同步设计

转载 作者:行者123 更新时间:2023-11-28 07:21:50 25 4
gpt4 key购买 nike

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

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

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 会被锁定,等待被 long 函数锁定和使用的互斥锁。

我在想,当应用程序想要退出时,是否有任何方法可以取消 BlockingQueuedConnection 或者是否有其他实现方法。

最佳答案

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

  1. 将您的计算放入 QObject 中的槽中。

  2. 将设置退出标志的代码放到另一个槽中(比如Q_SLOT void finish();)

  3. 创建对象的一个​​实例。创建 QThread 的实例。调用 myObject->moveToThread(myThread)

  4. 开始讨论。

  5. 将 gui 信号连接到计算对象中的插槽,类似地连接计算对象中指示数据已准备好的信号。

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

    1. connect(gui, SIGNAL(stop()), myObject, SLOT(finish()) - 停止计算

    2. connect(gui, SIGNAL(stop()), myObject->thread(), SLOT(quit())) - 结束线程中的事件循环

    3. connect(myObject->thread(), SIGNAL(finished()), myObject->thread(), SLOT(deleteLater()) - 当 run() 方法返回

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

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

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

关于c++ - Qt线程同步设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19339976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com