I’m doing pagination and need to store ready-made models for some pages. Create threads to fill models for pages. If I debug the program, get a segfault sometimes when finish executing the fillModel lambda, sometimes when creating QSqlQuery in getQuery.
#include <QCoreApplication>
#include <thread>
#include <vector>
#include <mutex>
#include <condition_variable>
#include <QDebug>
#include <QSqlQueryModel>
#include <QSqlQuery>
struct Thread
{
std::thread thread;
QSqlQueryModel model = QSqlQueryModel();
std::mutex done_mtx;
std::condition_variable done_cv;
bool done = false;
};
std::vector<Thread> pages_threads(3); // There is contains prepared models
QSqlQuery getQuery(int page_index)
{
static std::atomic<int> id = 1;
QString connect_name = QString::number(++id);
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", connect_name);
db.setDatabaseName("path_to_db");
db.open();
if(!db.isOpen() || !db.isValid())
qDebug() << "DB not open";
QString query = "SELECT * FROM USER LIMIT 20 OFFSET " + QString::number( (page_index-1) * 20);
QSqlQuery sqlQ(query, db);
return sqlQ;
}
void fillThread(int i)
{
auto fillModel = [](int page_index, int thread_idx)
{// When this lambda finish get a seg fault
pages_threads[thread_idx].model.setQuery( getQuery(page_index) );
std::lock_guard<std::mutex> lk( pages_threads[thread_idx].done_mtx);
pages_threads[thread_idx].done = true;
pages_threads[thread_idx].done_cv.notify_one();
};
switch (i) {
case 0:
pages_threads[0].done = false;
pages_threads[0].thread = std::thread( fillModel, 0, 0);
pages_threads[0].thread.detach();
break;
case 1:
pages_threads[1].done = false;
pages_threads[1].thread = std::thread( fillModel, 1, 1);
pages_threads[1].thread.detach();
break;
case 2:
pages_threads[0].done = false;
pages_threads[1].done = false;
pages_threads[2].done = false;
pages_threads[0].thread = std::thread( fillModel, 0, 0);
pages_threads[1].thread = std::thread( fillModel, 1, 1);
pages_threads[2].thread = std::thread( fillModel, 2, 2);
pages_threads[0].thread.detach();
pages_threads[2].thread.detach();
pages_threads[1].thread.join();
break;
default:
break;
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
fillThread(2);
return a.exec();
}
code which trigger seg fault
stack
I use QT 6.6.1 version, GDB 11.2, Windows 10, SQLite
New contributor
Qwerty is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.