БД - постгрес. Вот трэд:
#ifndef QALARMCHECK_H
#define QALARMCHECK_H
//
#include <QThread>
#include "./../log.h"
class QAlarmCheck : public QThread
{
Q_OBJECT
private:
int iUID;
QLog* qlLog;
public:
QAlarmCheck(const int uid);
~QAlarmCheck();
protected:
void run();
};
#endif // QALARMCHECK_H
#include <QtGui>
#include <QtSql>
#include "qalarmcheck.h"
//
QAlarmCheck::QAlarmCheck(const int uid)
{
iUID=uid;
qlLog=new QLog();
}
//
QAlarmCheck::~QAlarmCheck()
{
delete qlLog;
}
//
void QAlarmCheck::run()
{
qlLog->message("QAlarmCheck","Start");
QSqlQuery* qsqQuery=new QSqlQuery(QSqlDatabase::database("QSZN"));
qsqQuery->prepare("SELECT count(*) FROM alarms_table "
"WHERE uid=:uid AND date=:date AND to_char(time,'HH24:MI')=:time");
//Set 1 second
this->sleep(60-QTime::currentTime().second()+1);
do
{
qsqQuery->bindValue(":uid",iUID);
qsqQuery->bindValue(":date",QDate::currentDate());
qsqQuery->bindValue(":time",QTime::currentTime().toString("hh:mm"));
if (qsqQuery->exec() && qsqQuery->next())
if (qsqQuery->value(0).toInt()>0)
{
qlLog->message("QAlarmCheck","Notify");
QSqlQuery* qsqQueryTmp=new QSqlQuery(QSqlDatabase::database("QSZN"));
qsqQueryTmp->exec("NOTIFY alarm");
delete qsqQueryTmp;
}
this->sleep(60);
}
while (this->isRunning());
delete qsqQuery;
qlLog->message("QAlarmCheck","Stop");
}
//
Это что-то типа крона, т.е. раз в минуту проверяет есть ли какое-либо напоминание на данную дату/время и если да, то создает NOTIFY. Запускаю я эту нить после запуска основного окна. Периодически в консоль вывалюваются вот такие сообщения:
message type 0x43 arrived from server while idle
message type 0x5a arrived from server while idle
message type 0x43 arrived from server while idle
message type 0x5a arrived from server while idle
И иногда, после таких вот сообщений, любое обращение к БД из основного окна приводит к зависанию.