【问题标题】:QProgressBar and heavy taskQProgressBar 和繁重的任务
【发布时间】:2017-03-31 20:31:59
【问题描述】:

我的任务很重。我创建了 QProgressBar 来显示该程序仍然有效,并使用 c++ std::thread 类在另一个线程中运行繁重的任务。但是 QProgressBar 不起作用,只有带有 QProgressBar 的窗口才会启动。 代码如下:

QProgressBar progress;
progress.setRange(0, 0);
progress.show();
if (keyLength == 1024)
    std::thread(&RSA::generateKeys, &rsa, RSA::RSA_1024).join();
else if (keyLength == 2048)
    std::thread(&RSA::generateKeys, &rsa, RSA::RSA_2048).join();

结果如下:

【问题讨论】:

  • 还有,指示进度条更改状态的代码在哪里?为什么要将进度条设置为未确定状态,而不是设置有效的最小/最大值,并在当前值发生变化时发出信号?
  • 它应该在没有最小值和最大值的情况下运行,就像这样doc.qt.io/qt-5/images/macintosh-progressbar.png
  • 请详细说明如何您认为它会这样做吗?它应该如何在正确的时间内通过 0-100% 的进度条长度,而没有任何关于更新状态的信号?
  • 根据documentation如果最小值和最大值都设置为0,则条形图显示忙碌指示符而不是步数百分比。 但是,没有问题中有足够的信息来判断是否显示了 busy indicator,但是很明显,进度条不应该显示(如问题所示)。

标签: c++ multithreading qt qprogressbar


【解决方案1】:

事情不是这样做的。 :) Here 你可以看到我制作的一个使用 Worker 模式的示例(一个单独的线程,处理一些繁重的任务并向 UI 报告)。这是我的应用程序的外观:

我使用QThread(包含处理处理的对象的工作线程),我只能建议您这样做。你也可以继承 QThread 并覆盖 run() 方法,这取决于你真正需要的,但这种情况很少发生。

PS:作为替代方案,您可以使用QRunnable(对于每隔一段时间执行一次且不需要始终管理单独线程的任务非常有用)。 QRunnable 的问题在于它没有子类化 QObject,这意味着您不能使用 slot-signal 机制向 UI 报告。当然你可以改变它,但它违背了 runnable 的目的,它旨在成为一个非常轻量级的解决方案。

【讨论】:

  • 我不明白,为什么我不能使用 c++ 线程来完成这个任务?我不想报告,我做了多少任务,我只想报告用户,那个任务还在解决中。
  • 据我了解,您希望进度条报告任务(在单独的线程中)已经完成了多远,对吧?向 UI 报告需要您使用信号,为此,QThread 是可行的方法。
  • @rbaleksandar QThread 是一个线程句柄。就像您不会修改文件句柄类一样,您也不应该通过派生 QThread 来修改它。如果您想要信号,请从QObject 派生,或者放弃信号并将呼叫直接排队到接收器GCD-style。您可以从任何线程发出信号或对插槽调用进行排队。 QThread 在这方面没有任何特殊之处。
  • 我根本没有说“子类 QThread”。事实上,如果你真的检查我发布的链接,你会看到我使用了 QObject 并将其移动到 QThread 的通用实例。
猜你喜欢
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 2019-06-28
相关资源
最近更新 更多