2017-03-31 21 views
-1

我有繁重的任务。我创建了QProgressBar来显示该程序仍然工作,并在另一个使用C++ std :: thread类的线程中运行繁重的任务。但QProgressBar不起作用,只有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(); 

下面是结果: enter image description here

+2

而且,哪里是代码,它表示更改状态的进度栏?为什么将进度条设置为未确定状态,而不是设置有效的最小/最大值,并且每当当前值发生变化时就发出信号? –

+0

它应该运行并没有最小值和最大值运行,就像这样http://doc.qt.io/qt-5/images/macintosh-progressbar.png – van9petryk

+1

请详细说明_how_你认为它是这样吗?在正确的时间内,它应该如何运行0-100%的进度条长度,没有任何更新状态的信号? –

回答

0

这不是事情是如何完成的。 :) Here您可以看到我使用Worker模式(一个单独的线程处理一些繁重的任务并向UI报告)所做的示例。这里是我的应用程序的外观:

enter image description here

我用QThread(包含处理的处理对象工作线程),我只能建议你这样做。您也可以子类QThread并根据您真正需要替代run()方法,但情况很少。

PS:作为一种替代方案,您可以使用QRunnable(对于每隔一段时间完成一次的任务非常有用,不需要单独管理所有时间)。 QRunnable的问题在于它不包含QObject,这意味着您无法使用插槽信号机制向UI报告。当然,你可以改变它,但是它打破了runnable的目的,它的目标是成为一个非常轻量级的解决方案。

+0

我不明白,为什么我不能使用C++线程执行此任务?我不想报告,我做了多少任务,我只想报告用户,那个任务仍在解决。 – van9petryk

+0

从我的理解你想要进度条来报告任务(在单独的线程)已经完成了多远,对吗?向用户界面回报需要你使用信号,因为'QThread'是最好的选择。 – rbaleksandar

+0

@rbaleksandar'QThread'是一个线程句柄。就像你不会修改文件句柄类一样,你不应该通过派生它来修改'QThread'。如果你想要信号,从'QObject'派生,或者放弃信号并将调用直接排队到接收者,[GCD-style](http://stackoverflow.com/a/21653558/1329652)。您可以从任何线程发出信号或排队插槽呼叫。在这方面,“QThread”并不特别。 –