QThread для отправки больших запросов к базе данных - PullRequest
3 голосов
/ 11 февраля 2009

Я создал этот класс, который наследуется от 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(); }

1 Ответ

3 голосов
/ 10 октября 2011

Пара мнений:

Эта петля 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 ();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...