sql模块和多线程应用程序
QSql module and multithreaded application
我对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创建了它自己的 QSqlDatabase。如果它引用db()
创建的_db
,这将是一个问题。缺点是它实际上没有做任何事情。
QSqlDatabase不是QObject,但它有一个驱动程序,该驱动程序是QObject,因此具有线程亲和性。
如果创建qsqldatabase的负载是禁止的,创建工作线程维护自己的连接。然后将查询分派给这些线程,而不是创建新的线程和新的连接。
相关文章:
- 通过安装信号处理程序关闭多线程应用程序
- 多线程 gtkmm 应用程序最简单的示例
- 将数组作为多线程应用程序中函数的返回传递
- 修改多线程应用程序中的对象
- 多线程 C++11 应用程序中的同步
- 多线程Windows GUI应用程序中的死锁
- C++多线程应用程序将永远挂起
- 具有多线程应用程序的 Nanomsg 无阻塞双向套接字
- 在接收 SIGINT 操作时适当地关闭多线程 c++ 应用程序
- 如何在多线程应用程序中获得花费的时间
- Linux VM(重型多线程应用程序)的性能改进
- C 多线程崩溃应用程序
- 在C 多线程应用程序中,设置了并发线程的最大数量
- C++多线程应用程序崩溃
- 如何在 Mac 上的 C++ 应用程序中使用多线程?
- 多线程应用程序中的零MQ处理中断
- 使用C 的多线程应用程序中测量全局时间(壁挂)的最快方法
- 如何在多线程应用程序中使用 pybind11
- C++应用程序多线程中的锁定方法
- PPL任务-桌面应用程序UI线程中的延续