我创建了一个从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/