QThread для отправки больших запросов в базу данных

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

qt4
person Jesus Fernandez    schedule 11.02.2009    source источник


Ответы (1)


Пара мнений:

Цикл 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 ();
person spraff    schedule 10.10.2011