我创建了这个继承自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(); }
答案 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 ();