我创建了一个从QThread继承的类,用于将数据发送到数据库服务器,您对此有何看法?可以改善吗?

谢谢

#ifndef QUERYTHREAD_H
#定义QUERYTHREAD_H

#包括

QSqlQuery类;

类QueryThread:公共QThread {
公共插槽:
bool exec(QSqlQuery * query,Priority priority = InheritPriority);
受保护的:
虚拟虚空run();
私人的:
bool m_hasError;
QSqlQuery * q;
};

#endif // QUERYTHREAD_H

#include“ querythread.h”

#包括
#包括

布尔QueryThread :: exec(QSqlQuery * query,Priority priority)
{
q =查询;
开始(优先级);
while(isRunning())qApp-> processEvents();
返回m_hasError;
}

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

最佳答案

几点意见:

while中的exec循环消除了使用单独线程的优点。您应该在构造函数处传递查询,每个查询只有一个线程,不要覆盖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 ();

关于qt4 - QThread将大型查询发送到数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/536660/

10-10 08:08