2009-02-11 42 views
3

我已经创建了这个类,该类继承自QThread用于将数据发送到数据库服务器,您怎么看待它?可能会损坏?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(); }

回答

2

一对夫妇的观点:

while环在exec elimiates具有一个单独的线程的优点。您应该在构造函数中传递查询,每个查询有一个线程,不要覆盖exec,宁愿只使用start并使用信号来异步报告任何错误。

您还应该按值传递QSqlQuery,或将其存储在托管指针中,如std::auto_ptr(或用于C++ 11的std::unique_ptr)。许多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();