我有一个程序,到目前为止,它已在主线程中运行了所有程序。 GUI程序具有25个以上的用户输入变量,从数据库读取数据,对数据进行计算并吐出电子表格。这最多可能需要1分钟才能完成。
现在,我希望在多达1000次迭代的循环中执行此操作,因此我想对其进行多线程处理以提高性能。
我已经完成了一次运行,几乎已经完成,现在有一些问题并正在寻求有关最佳实践的建议。
线程需要在运行时更新其进度,然后在完成时发送回信息。
我正在将QThread与插槽/信号一起使用以从线程与主线程进行通信,并使用Worker变量与线程进行通信。我的工人班是:
class Worker : public QObject
{
Q_OBJECT
private:
//variables used in the calculations
public:
///25 user input variables here
explicit Worker(QObject *parent = 0);
signals:
void sendRunOnce(std::vector<QString> rows);
void sendProgress(int amount);
void sendFinalAmount(int id, double amount);//used when looping the mutiple thread runOnce
void sendLog(QString text);
public slots:
double doWork();//where the calculations are done
};
然后我在这里创建并运行线程/工作者:
QThread* thread = new QThread();
Worker* worker = new Worker();
//get all the ui elements and
//set the 25 worker variables
worker->moveToThread(thread);
//set connections
connect(thread, SIGNAL(finished()),worker, SLOT(deleteLater()));
connect(thread, SIGNAL(started()), worker, SLOT(doWork()));
connect(worker, SIGNAL(sendRunOnce(std::vector<QString>)),this, SLOT(receiveRunOnce(std::vector<QString>)));
thread->start();
这一切正常。
所以我的问题是:
1:我是通过最佳实践来这样做吗?>
2:真正的问题是如何监视线程并使线程保持运行状态,直到完成所有工作。
我正在考虑使用QThread :: idealThreadCount在主类中创建线程向量,以查看一次应运行多少(对于GUI Thread为-1,然后启动它们。
然后线程结束时,我将有一个信号/插槽。然后,该插槽将检查是否需要启动另一个线程并启动它,如果不需要,则对接收到的数据进行最终计算。
问题是,我无法弄清楚如何连接信号并使它正常工作。
我想我可以将finished()
连接到另一个SLOT并让该SLOT进行处理,但是如果不首先调用deleteLater()并且该线程没有被破坏该怎么办...我将尝试启动另一个线程而不是CPU数量。
我有一个程序,到目前为止,它已在主线程中运行了所有程序。 GUI程序具有25个以上的用户输入变量,从db读取数据,对数据执行计算并吐出电子表格....
尝试使用QtConcurrent映射这是例子https://doc.qt.io/qt-5/qtconcurrentmap.html