在while循环中运行Qt程序 我正在运行一个C++程序,用Qt构建,它永远不会停止。 程序总是从数据库中获取数据,如果有结果,则发送SMS

在while循环中运行Qt程序 我正在运行一个C++程序,用Qt构建,它永远不会停止。 程序总是从数据库中获取数据,如果有结果,则发送SMS,c++,mysql,qt,C++,Mysql,Qt,我可以连接到数据库,但几个小时后(+/-10),它就不再工作了 我不知道问题是因为我与数据库失去了连接还是因为我的计算机处于待机状态 我无法在Qt中看到数据库状态:db.open()在while循环内测试时总是返回true QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName(""); db.setPort(); db.setDatabaseName(""); db.setUserName(""); db.se

我可以连接到数据库,但几个小时后(+/-10),它就不再工作了

我不知道问题是因为我与数据库失去了连接还是因为我的计算机处于待机状态

我无法在Qt中看到数据库状态:
db.open()
在while循环内测试时总是返回
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
    }
}

无论出于何种原因,总有可能失去DB连接。你不能依赖它。如果连接丢失,您必须检查循环内的连接,并实施某种重新连接方案。据我所知,Qt并没有为您做到这一点。

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

我知道,但是如何检查这个连接
QSqlDatabase::open
始终返回true。即使连接失败。查看失败时间的唯一方法是在数据库中插入数据,必须发送数据。只需执行您打算执行的SQL,并检查exec()或您使用的任何方法的结果。如果失败,您可以使用QSqlDatabase::lastError()检查QSqlError::ConnectionError。如果为true,则可能需要重新初始化连接。我怀疑,即使数据库不可用,新连接对象上的open(…)也会返回true。如果没有连接,
open
应该返回false。我的问题是串行端口连接。打开一个新问题,我理解了问题所在:不是数据库或计算机状态,而是串行端口连接。见新问题谢谢你的回答。你能给我举个例子吗?我只能在Qt文档中看到插槽示例;我不需要。类似于javascript:
setInterval(myFunction,1000) C++中添加的例子,问题是用C++标记的,不是JavaScript。谢谢!我是Qt中的乞丐,无法将其应用于我的代码。。。请给我一个关于
QApplication::processEvents
的简单例子好吗?更简单但不推荐的方法是在while(true)循环中只放一行代码“QApplication::processEvents()”。确保该文件包含其所属的QApplication。QApplication与widget一起使用,而QCoreApplication没有。