gpt4 book ai didi

c++ - QSql模块与多线程应用

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:26:28 29 4
gpt4 key购买 nike

我对 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() 生成和管理。

所以,既然这段代码有效,我应该去尝试还是会遇到这样做有困难吗?

欢迎提供任何帮助、文档或解释!谢谢。

最佳答案

上面的代码很好,因为 QSqlQuery creates its own QSqlDatabase .如果它引用由 db() 创建的 _db 将是一个问题。不利的一面是它实际上任何事情。

QSqlDatabase 不是 QObject 但它有一个 driver这是一个 QObject,因此有 thread affinity .

如果禁止创建大量 QSqlDatabases,请创建 worker threads保持自己的联系。然后将查询分派(dispatch)给这些线程,而不是创建新线程和新连接。

关于c++ - QSql模块与多线程应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7566949/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com