#cpp #qt
Как можно модифицировать ПО для мультипоточной работы.
Хотелось бы увидеть минимальный базовый пример, дабы разобраться и пока не лезть в дебри.
Есть большая таблица(100 тыс наименований) при их запросе виснет GUI.
Хотелось бы это устранить.
Логика была такая.
Человек открывает программу.
Конструктор формы отправил запрос потоку в БД.
Строится каркас приложения.
Берём данные из потока в основной.
Заполняем полученными данными таблицу.
p.s
Пробовал сделать подобное на сигналах и слотах с применением QThread. Отправлял запрос
в другой поток, но он начинал работать только когда закроется основное приложение...
mainwindow.СPP
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
//QSqlDatabase objDatabase;
objDatabase = QSqlDatabase::addDatabase("QMYSQL");
objDatabase.setDatabaseName("librarydb");
objDatabase.setHostName("127.0.0.1");
objDatabase.setPort(3306);
objDatabase.setUserName("hays0503");
objDatabase.setPassword("hays0503");
objDatabase.open();
//QSqlTableModel *objTableModel;
objTableModel = new QSqlTableModel();
objTableModel->setTable("author");
if (!objTableModel->select())
{
qDebug()<<"Error";
}else {
ui->tableView->setModel(objTableModel);
}
}
mainwindow.H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
QSqlDatabase objDatabase;
QSqlTableModel *objTableModel;
};
#endif // MAINWINDOW_H
Ответы
Ответ 1
void MainWindow::on_pushButton_clicked() { QFuturefuture = QtConcurrent::run( [this]() { // Исполняем этот код в другом потоке //QSqlDatabase objDatabase; objDatabase = QSqlDatabase::addDatabase("QMYSQL"); objDatabase.setDatabaseName("librarydb"); objDatabase.setHostName("127.0.0.1"); objDatabase.setPort(3306); objDatabase.setUserName("hays0503"); objDatabase.setPassword("hays0503"); objDatabase.open(); //QSqlTableModel *objTableModel; objTableModel = new QSqlTableModel(this); objTableModel->setTable("author"); if (!objTableModel->select()) { delete objTableModel; objTableModel = nullptr; qDebug()<<"Error"; } return objTableModel; }); QFutureWatcher *watcher = new QFutureWatcher (this); connect(watcher, SIGNAL(finished()), watcher, [this, watcher]() { // Запускаем этот код в UI потоке, когда объект future завершит свою работу в рабочем потоке ui->tableView->setModel(watcher->result()); watcher->deleteLater(); // Удалим ненужный watcher }, Qt::QueuedConnection); ); watcher->setFuture(future); // Связываем watcher с feature. Это быстрая операция и не тормозит поток UI } Если много раз кликать на кнопку, то будет запущено сразу много одинаковых задач. Надо не забывать, что работать с объектами objDatabase и objTableModel можно только из одного потока одновременно.
Комментариев нет:
Отправить комментарий