У меня есть два класса: 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();
А собственно зачем вам второй поток? 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) по сигналу от кнопки.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
1>lab_2obj : error LNK2005: _DllMain@12 already defined in dllmain
Всем приветСтрадаю от неумения правильно придумывать названия своим классам