如何用QtConcurrent替换Qthread

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

我有一个SQL提取类,该类可连接到SQL并提取所需的数据。

我想在另一个线程中这样做,所以我用QThread做到了。它正在按预期的方式工作。

但是现在我想用QTConcurrent代替它。 T 我遇到的QTconcureent问题是我需要一个连接命令,该线程在执行SQL查询之前会初始化数据库。

这里我创建的代码是公共插槽,qint64TotalSize是SqlFetcher类的公共方法。

Controller::Controller(QObject *parent) : QObject(parent)
{
    SqlFetcher* m_Fetcher = new SqlFetcher();

    qInfo() <<"Start"<< QThread::currentThread();

     QFutureWatcher<void> watcher;
     QFuture <void> future1 = QtConcurrent::run(m_Fetcher,&SqlFetcher::qint64TotalSize);

     watcher.setFuture(future1);


    //QThread* t1 = new QThread();
    //m_Fetcher->moveToThread(t1);

    //connect(t1, &QThread::started, m_Fetcher, &SqlFetcher::createDb);
    //connect(t1, &QThread::started, m_Fetcher, &SqlFetcher::qint64TotalSize);
    //t1->start();


    qInfo() <<"Finish"<< QThread::currentThread();

}

void SqlFetcher::qint64TotalSize()
{
    qint64 l_result= 0;
    QSqlQuery l_query;

    if (m_sqldb.isValid())
    {
        m_sqldb.open();

        if ((m_sqldb.isOpen()))
        {
            l_query.prepare("SELECT COUNT(*) FROM table1");
            l_query.exec();

            if (l_query.next()) {
                l_result= l_query.value(0).toInt();
            }
            m_sqldb.close();
        }
    }

    qInfo() << l_result << QThread::currentThread();
}

void SqlFetcher::createDb()
{
    m_sqldb = QSqlDatabase::addDatabase("QSQLITE");
    m_sqldb.setDatabaseName("xyz.db");
     qInfo() << "createDB" << QThread::currentThread();
}


我当前的输出是

Start QThread(0x7feab4c0f060)
Finish QThread(0x7feab4c0f060)
0 QThread(0x7feab4d42070, name = "Thread (pooled)")

期望的输出或带有Qthread的输出是>

Start QThread(0x7fe82140f060)
Finish QThread(0x7fe82140f060)
createDB QThread(0x7fe82155c840)
151 QThread(0x7fe82155c840)

我有一个SQL提取类,该类可连接到SQL并提取所需的数据。我想在另一个线程中做到这一点,所以我用QThread做到了。它正在按预期方式工作。但是现在我想...

c++ multithreading qt qthread qtconcurrent
1个回答
1
投票

例如,尝试在run中执行整个任务

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