QThread将大型查询发送到数据库

时间:2009-02-11 13:01:26

标签: qt4

我创建了这个继承自QThread的类,用于将数据发送到数据库服务器,您如何看待它?可能会受到影响吗?

由于

#ifndef QUERYTHREAD_H
#define QUERYTHREAD_H

#include 

class QSqlQuery;

class QueryThread : public QThread {
    public slots:
        bool exec(QSqlQuery *query, Priority priority=InheritPriority);
    protected:
        virtual void run();
    private:
        bool m_hasError;
        QSqlQuery *q;
};

#endif // QUERYTHREAD_H
#include "querythread.h"

#include 
#include 

bool QueryThread::exec(QSqlQuery *query, Priority priority)
{
    q=query;
    start(priority);
    while(isRunning()) qApp->processEvents();
    return m_hasError;
}

void QueryThread::run()
{ m_hasError=q->exec(); }

1 个答案:

答案 0 :(得分:3)

一些意见:

while中的exec循环消除了拥有单独线程的优点。你应该在构造函数中传递查询,每个查询有一个线程,覆盖exec,更喜欢只使用start并使用信号异步报告任何错误

您还应该按值传递QSqlQuery或将其存储在托管指针中,例如std::auto_ptr(或std::unique_ptr用于C ++ 11)。许多Qt类都是implicitly shared(虽然不是这个)但是托管指针会让你获得异常安全性。

就个人而言,我会做一些像这样的事情

class Query : public QThread {

    QSqlQuery m_query;
    // I prefer values unless there's a particular reason to use pointers.

public:

    Query (const QSqlQuery & query)
    : m_query (query)
    {
    }

    void run ()
    {
        emit finished (m_query .exec ());
        deleteLater ();
    }

public signals:

    void finished (bool);
};

Query * q = new Query ("SELECT foo FROM bar");

connect (q, SIGNAL (finished (bool), ...);

q -> start ();