3

我创建了这个继承自 QThread 的类,用于将数据发送到数据库服务器,你怎么看?可以改善吗?

谢谢

#ifndef QUERYTHREAD_H
#define QUERYTHREAD_H

#包括

类 QSqlQuery;

类查询线程:公共 QThread {
    公共插槽:
        bool exec(QSqlQuery *query, Priority priority=InheritPriority);
    受保护:
        虚空运行();
    私人的:
        布尔 m_hasError;
        QSqlQuery *q;
};

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

#包括
#包括

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

无效查询线程::运行()
{ m_hasError=q->exec(); }
4

1 回答 1

3

几点意见:

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

您还应该按值传递 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 ();
于 2011-10-10T14:17:33.277 回答