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

Qt4 QThread将大型查询发送到数据库,qt4,Qt4,我创建了这个从QThread继承的类,用于将数据发送到数据库服务器,您对此有何看法?能给人留下深刻印象吗 谢谢 #ifndef QUERYTHREAD_H #define QUERYTHREAD_H #include class QSqlQuery; class QueryThread : public QThread { public slots: bool exec(QSqlQuery *query, Priority priority=InheritPrio

我创建了这个从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 #ifndef QUERYTHREAD\U H #定义QUERYTHREAD\u H #包括 类QSqlQuery; 类QueryThread:publicqthread{ 公众时段: bool exec(QSqlQuery*query,Priority-Priority=InheritPriority); 受保护的: 虚空运行(); 私人: 布尔-穆哈斯错误; QSqlQuery*q; }; #endif//QUERYTHREAD\u H #包括“querythread.h” #包括 #包括 bool QueryThread::exec(QSqlQuery*查询,优先级) { q=查询; 启动(优先级); while(isRunning())qApp->processEvents(); 返回m_hasError; } void QueryThread::run() {m_hasError=q->exec();}几点看法:

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

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

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

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 ();
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 ();