在while循环中运行Qt程序

时间:2014-10-19 16:40:20

标签: c++ mysql qt

我正在运行一个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
    }
}

2 个答案:

答案 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
    }
}