5

Sql モジュールが Qt のマルチスレッド アプリケーションでどのように動作するかが問題です。 http://doc.qt.io/qt-5/threads-modules.html#threads-and-the-sql-moduleは、「接続は、それを作成したスレッド内からのみ使用できる」と明確に述べています。

ただし、私が書いたこのコードは動作します:

#include <QCoreApplication>
#include <QSqlQuery>
#include <QtConcurrentRun>

void    req()
{
  QSqlQuery q("INSERT INTO users (username) VALUES (\"test\")");
}

void    db()
{
  QSqlDatabase _db;

  _db = QSqlDatabase::addDatabase("QMYSQL");
  _db.setDatabaseName("dbname");
  _db.setHostName("host");
  _db.setUserName("username");
  _db.setPassword("password");
  if (_db.open())
    std::cout << "Ok" << std::endl;
  else
    std::cout << "Error" << std::endl;
}

int     main(int ac, char **av)
{
  QCoreApplication app(ac, av);
  QtConcurrent::run(db);
  sleep(1);
  QtConcurrent::run(req);
  return app.exec();
}

私のアプリケーション設計では、データベースと対話するために複数のスレッドが必要です。これらのスレッドは、QtConcurrent::run() によって生成および管理されます。

それで、このコードは機能するので、私はそれを行うべきですか、それとも問題が発生しますか?

ヘルプ、ドキュメント、または説明は大歓迎です! ありがとうございました。

4

1 に答える 1

6

QSqlQuery は独自のQSqlDatabaseを作成するため、上記のコードは問題ありません。_dbによって作成されたものとして参照されると問題になりますdb()。マイナス面は、実際には何もしないことです。

QSqlDatabase は QObject ではありませんが、QObject であるドライバーを持っているため、スレッド アフィニティがあります。

QSqlDatabases の負荷を作成することができない場合は、独自の接続を維持するワーカー スレッドを作成します。次に、新しいスレッドを作成して新しい接続を作成するのではなく、クエリをこれらのスレッドにディスパッチします。

于 2011-09-27T09:35:02.373 に答える