QSql模块和多线程应用程序

Xaq*_*aqq 5 c++ qt multithreading qtsql

我对Qt模块如何在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();
}
Run Code Online (Sandbox Code Playgroud)

我的应用程序设计需要多个线程与数据库交互.线程由QtConcurrent :: run()生成和管理.

那么,既然这段代码可以用,或者我会遇到麻烦吗?

欢迎任何帮助,文档或解释!谢谢.

spr*_*aff 6

上面的代码很好,因为QSqlQuery 创建了自己的 QSqlDatabase.如果它被引用_db为创建,那将是一个问题db().缺点是它实际上没有任何事情.

QSqlDatabase不是QObject,但它有一个驱动程序,它是一个QObject,因此具有线程关联.

如果创建QSqlDatabases的加载是禁止的,则创建维护自己连接的工作线程.然后将查询分派给这些线程,而不是创建新线程,从而创建新连接.