3

データベース サーバーにデータを送信するために QThread を継承するこのクラスを作成しましたが、どう思いますか? 改善できますか?

ありがとう

#ifndef QUERYTHREAD_H
#QUERYTHREAD_H を定義

#含む

クラス QSqlQuery;

クラス QueryThread : public QThread {
    公開スロット:
        bool exec(QSqlQuery *query, Priority priority=InheritPriority);
    保護:
        virtual void run();
    プライベート:
        bool m_hasError;
        QSqlQuery *q;
};

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

#含む
#含む

bool QueryThread::exec(QSqlQuery *クエリ, 優先度優先度)
{
    q=クエリ;
    開始(優先);
    while(isRunning()) qApp->processEvents();
    m_hasError を返します。
}

void QueryThread::run()
{ m_hasError=q->exec(); }
4

1 に答える 1

3

いくつかの意見:

このwhileループはexec、別のスレッドを持つことの利点を排除します。コンストラクターでクエリを渡し、クエリごとに1つのスレッドを持ち、オーバーライドせずexec開始シグナルとシグナルを使用してエラーを非同期的に報告することをお勧めします。

また、QSqlQueryを値で渡すか、std::auto_ptr(またはstd::unique_ptrC ++ 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 に答える