我有这样一个应用, UI线程,使用 QSqltablemodel 和 Qtableview
显示数据库里面的数据。 在UI线程中中创建了另一个
线程,用于不停采集数据,向数据库插入。
数据很小时,显示和插入就
没有问题。但是当sqlite里数据量大了以后,只要UI线程一执行select(),另一个线程的的 query.exec() 就返回false里。请教破解方法!
我的代码类似这样:
在UI线程中创建一个数据库连接
- processDisplayDB =new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE","processDisplaydb"));
- processDisplayDB->setDatabaseName("databases/ProductionData.s3db");
- if(!processDisplayDB->open()){
- qDebug()<<"Could not open file!"<<endl;
- return;
- }else{
- qDebug()<<"Open file: "<<processDisplayDB->databaseName()<<" sucessfully!"<<endl;
- }
- modelProcessDisplay = new QSqlTableModel(ui->tableViewProcessDisplay,*processDisplayDB);
- modelProcessDisplay->setTable("processtable");
然后通过定时器周期触发刷新信号,
- connect(&cylicTimerProcessDisplay,&QTimer::timeout,this,&MainWindow::processDisplayUpdate_cylic);
通过刷新来更新tableview内容
- void MainWindow::processDisplayUpdate_cylic()
- {
- modelProcessDisplay->select();
- }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
另外一个线程是,建了另外一个连接到同一个数据库
- processDB = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE","processDB"));
- processDB->setDatabaseName("databases/ProductionData.s3db");
- if(!processDB->open()){
- qDebug()<<"Could not open file!"<<endl;
- return;
- }else{
- qDebug()<<"Open file: "<<processDB->databaseName()<<" sucessfully!"<<endl;
- }
然后数据采集到以后,写入数据库
- QSqlQuery query(*processDB);
- qDebug()<<"insert processtable prepare : "
- <<query.prepare("INSERT INTO processtable(SerialNo) "
- "VALUES(:SerialNo)");
- query.bindValue(":SerialNo",currentSerialNo);
- qDebug()<<"insert processtable: "<<query.exec();
现在的问题是,当sqlite里数据量增大后,
qDebug()<<"insert processtable: "<<query.exec(); 就执行不成功了。 经过检查,发现是 UI线程里 select() 引起的,但是不知道该怎么解决为好? 这个数据库是采集设备状态,肯定数据库不停增大的。
请大家帮帮我看看?谢谢