• 1365阅读
  • 5回复

[讨论]Qt多个线程访问数据库问题 [复制链接]

上一主题 下一主题
 

只看楼主 倒序阅读 楼主  发表于: 2022-08-06
需求描述:在线程A、线程B写入数据数据库,窗口C在主线程获取数据库数据
目前做法:在线程C维护数据库db对象,线程AB数据通过信号与槽发送给线程C,在线程C执行数据库操作
想知道有什么更好的办法,这样的处理办法维护了太多的信号与槽,很烦
离线feng851

只看该作者 1楼 发表于: 2022-08-08
那就要看看你的线程A与线程B的是做什么业务了。感觉上,你是为了业务解耦分了这两个线程,而你通过信号传递给主线程操作数据库,可能是因为数据库是单线程文件型又或是为了保证数据库操作的原子性。没什么大问题啊,个人觉得,你的线程A和线程B也可以通过信号和slot放在主线程内处理
离线tanyue.esec

只看该作者 2楼 发表于: 2022-08-08
感觉AB线程写入数据库,C线程读取数据库,天然就分开了,没必要搞个什么信号了。

主要是不了解ABC都是什么业务
离线yeguoxiong

只看该作者 3楼 发表于: 2022-08-10
可以试一下,用完数据库就关闭。这样可以不用考虑多线程
离线yeguoxiong

只看该作者 4楼 发表于: 2022-08-10
const QString &connectionName = QString("%1%2").arg(metaObject()->className()).arg(QRandomGenerator::global()->generate());
if(true)
{
    const DatabaseStruct &m_dbStruct = DataServices::instance()->dbStruct();
    QSqlDatabase db = QSqlDatabase::addDatabase(m_dbStruct.type, connectionName);
    db.setHostName(m_dbStruct.hostName);
    db.setDatabaseName(m_dbStruct.dbName);
    db.setUserName(m_dbStruct.userName);
    db.setPassword(m_dbStruct.password);
    db.setPort(m_dbStruct.port);
    if(db.open())
    {
        QSqlQuery query(db);
        query.prepare("SELECT COUNT(1) FROM g_t_devices WHERE LOCATE(?,IFNULL(areaToken,''))>0 LIMIT 1");
        query.addBindValue(projectId);
        query.exec();
        while(query.next())
        {
            qDebug()<<query.value(0).toInt();
        }
    }else
    {
        Utils::instance()->log4c()->addErrorLog(QStringLiteral("[数据管理]%1数据库打开出错,Error:%2。").arg(metaObject()->className()).arg(db.lastError().text()));
    }
    db.close();
}
QSqlDatabase::removeDatabase(connectionName);
离线angelus

只看该作者 5楼 发表于: 2022-08-11
线程A独立写入数据A;  发送信号 告诉C ,写完了
线程B独立写入数据B; 发送信号 告诉C,写完了
线程C,接到信号,就去数据库读,更新界面

写数据的类需要你自己处理下,加入一下写同步锁就行了.

线程里边的逻辑尽量封装独立,只抽象几个简单信号通知外界.这样你维护起来也简单
快速回复
限100 字节
 
上一个 下一个