C ++ QT,使用QThread跟踪线程

问题描述 投票:0回答:1

我有一个程序,到目前为止,它已在主线程中运行了所有程序。 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读取数据,对数据执行计算并吐出电子表格....

c++ multithreading qt signals-slots qthread
1个回答
0
投票

尝试使用QtConcurrent映射这是例子https://doc.qt.io/qt-5/qtconcurrentmap.html

© www.soinside.com 2019 - 2024. All rights reserved.