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 回答