QT MYSQL QThread

132
21 февраля 2019, 04:20

У меня есть два класса: checkMessage унаследованный от QThread и основной класс-форма mainwindow унаследованный от QWidget. В первом классе раз в несколько секунд идет проверка и добавление данных из бд в вектор. А из основного класса идет добавление новых данных в бд при нажитии кнопки. Но проблема когда одновременно два потока срабатывают в одно время появляется ошибка:

Lost connection to MySQL server during query QMYSQL: Unable to execute query

И программа вылетает.

Функция проверки данных в классе checkMessage

QVector<QString> vectorMessages;
void run()
{
    while(true)
    {
        query.exec("SELECT `message` FROM `messages`");
        vectorMessages.clear();
        while(query.next())
        {
            vectorMessages.push_back(query.value(0).toString() + "\n");
            //message+= query.value(0).toString() + "\n";
        }
        emit sendUpdate(); //  слот в главном потоке
        Sleep(1500);
    }
}

Функция добавления данных в форме:

QString message = ui->text_message->toPlainText();
query.prepare("INSERT INTO `messages`(`message`) VALUES (:mess)");
query.bindValue(":mess",message);
qDebug() << query.exec();
Answer 1

А собственно зачем вам второй поток? SELECT можно делать по таймеру. В этом случае не возникнет проблем с многопоточностью. Если результат SELECT очень большой, было бы логично выполнять отдельным потоком все операции с БД. Для этого можно сделать вот такой класс.

class QDb : public QObject
{
    Q_OBJECT
public:
    QDb(QObject *parent):QObject(parent){инициализация БД}
public slots:
    void insert(QString str){вставка значения}
    void select(){заполнение вектора};
signals:
    sendUpdate();
};
QDb *db = new QDb();
QThread thread* = new QThread();
db->moveToThread(thread);
thread->start();

Теперь все действия с БД будут выполнять в отдельном потоке и ошибок не будет. Вызывать select() можно по сигналу от таймера, а insert(QString str) по сигналу от кнопки.

READ ALSO
(VS2010) error LNK2005 + fatal error LNK1169: one or more multiply defined symbols found

(VS2010) error LNK2005 + fatal error LNK1169: one or more multiply defined symbols found

1>lab_2obj : error LNK2005: _DllMain@12 already defined in dllmain

145
Побитовый ввод/вывод (работа с файлами)

Побитовый ввод/вывод (работа с файлами)

Как по-битово вводить/выводить в/из файла?

135
Правильные названия классов в Java [закрыт]

Правильные названия классов в Java [закрыт]

Всем приветСтрадаю от неумения правильно придумывать названия своим классам

135
инспекция кода (крестики нолики)

инспекция кода (крестики нолики)

Изучаю Джава, пока не понимаю кокой код "чистый", а какой

221