Я написал программу на C ++, используя qt. некоторые переменные внутри моего алгоритма изменяются вне моей программы и на веб-странице. каждый раз, когда пользователь изменяет значения переменных на веб-странице, я изменяю предварительно созданную базу данных SQL.
Теперь я хочу, чтобы мой код изменял значение переменных во время выполнения без остановки кода. есть два варианта:
1). Каждые n секунд проверяют базу данных и извлекают значение переменных -> это не хорошо, так как я должен проверять, меняется ли содержимое базы данных каждые n секунд (это может быть без изменений в течение многих лет !!!, и я не хочу проверять если содержимое базы данных изменилось)
2). каждый раз, когда база данных изменяется, моя программа qt посылает сигнал, поэтому, перехватывая этот сигнал, я могу обновить значение переменных … Это кажется оптимальным решением, и я хочу написать код для этой части …
C ++ часть моего кода:
void Update Database()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("Mydataset");
db.setUserName("user");
db.setPassword("pass");
if(!db.open())
{
qDebug()<<"Error is: "<<db.lastError();
qFatal("Failed To Connect");
}
QSqlQuery qry;
qry.exec("SELECT * from tblsystemoptions");
QSqlRecord rec = qry.record();
int cols = rec.count();
qry.next();
MCH = qry.value(0).toString(); //some global variables used in other functions
MCh = qry.value(1).toString();
// ... this goes on ...}
Я был бы рад увидеть, что является лучшим решением QT для этой проблемы …
Спасибо вам всем.
Там нет такой вещи. Цикл событий Qt и база данных никак не связаны. Вы только получаете / изменяете / удаляете / вставляете / … данные и все. Вариант 1 — это тот, который вам нужно сделать. Есть способы использовать TRIGGER на стороне сервера для запуска внешних скриптов, но это не очень вам поможет.
QSqlDriver
поддерживает уведомления, которые испускают сигнал, когда произошло определенное событие. Чтобы подписаться на событие просто используйте QSqlDriver::subscribeToNotification( const QString & name )
, Когда событие, на которое вы подписываетесь, публикуется базой данных, драйвер подает сигнал уведомления (), и ваше приложение может предпринять соответствующие действия.
db.driver()->subscribeToNotification("someEventId");
Сообщение может быть отправлено автоматически из триггера или хранимой процедуры. Сообщение очень легкое: ничего, кроме строки, содержащей имя произошедшего события.
Вы можете подключить notification(const QString&)
сигнал на ваш слот, как:
QObject::connect(db.driver(), SIGNAL(notification(const QString&)), this, SLOT(refreshView()));
Я должен отметить, что эта функция не поддерживается MySQL, так как она не имеет механизма отправки событий.