我正在运行一个C ++程序,使用Qt构建,永远无法阻止 程序总是从数据库中提取数据,如果有结果则发送短信。
我能够连接到数据库,但在几个小时后(+/- 10),它再也无法工作了。
我不知道问题是因为我丢失了与数据库的连接,还是因为我的电脑处于待机状态......
我无法在Qt中查看数据库状态:db.open()
在循环中进行测试时始终返回true
。
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("");
db.setPort();
db.setDatabaseName("");
db.setUserName("");
db.setPassword("");
if (db.open())
{
while (true)
{
// MySQL Request
// If data -> send SMS
}
}
答案 0 :(得分:1)
无论出于何种原因,总是有可能丢失数据库连接。你不能依赖它。您必须在循环内检查您的连接,并在连接丢失时实施某种重新连接方案。据我所知,Qt并没有为你做到这一点。
答案 1 :(得分:0)
Qt提供了一个事件驱动的框架;事件发生,程序对这些事件作出反应。
当你有一个永无止境的循环时,事件会排队,等待它们被处理。在你的情况下,这永远不会发生,因此事件队列将不断增加,占用内存等资源。
有两种方法可以解决这个问题。第一种是在循环中不时地调用QApplication :: processEvents。
然而,更好的方法是删除while(true),而是使用QTimer,它将定期调用函数来处理任何可用数据。
假设你有一个派生自QObject的类,这里是使用QObject自己的计时器的骨架代码
class MyObject : public QObject
{
Q_OBJECT
public:
MyObject(QObject *parent = 0);
protected:
// this will be called periodically from the timer
void timerEvent(QTimerEvent *event);
private:
m_timerId = 0; // C++ 11 initialisation
};
MyObject::MyObject(QObject *parent)
: QObject(parent)
{
m_timerId = startTimer(50); // 50-millisecond timer
}
void MyObject::timerEvent(QTimerEvent *event)
{
if(event->timerId() == m_timerId)
{
// MySQL Request
// If data -> send SMS
}
}