2014-10-19 119 views
0

我正在运行一个C++程序,使用Qt构建,永远无法停止。
程序总是从数据库中提取数据,如果有结果发送短信。在while循环中运行Qt程序

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

我不知道这个问题是因为我失去与数据库或者因为我的电脑后进入待机状态连接...

我不能在Qt中看到数据库的状态:db.open()总是返回true测试时在while循环中。

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

我明白其中的问题是框架代码:无法与数据库或计算机的状态,但串行端口连接。看到新的问题 – gr3g 2014-10-20 06:13:56

+0

http://stackoverflow.com/questions/26459788/qt-serial-port-write-and-read-data – gr3g 2014-10-20 06:48:01

回答

1

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

+0

我知道,但如何检查此连接? 'QSqlDatabase :: open'总是返回true。即使连接失败。查看失败的唯一方法是在数据库中插入数据,必须发送 – gr3g 2014-10-19 16:55:55

+0

只需执行您打算执行的任何SQL,并检查exec()的结果或使用的任何方法。如果失败,您可以使用QSqlDatabase :: lastError()来检查QSqlError :: ConnectionError。如果为true,则可能需要重新初始化连接。我怀疑在新的连接对象上打开(...)总是返回true,即使数据库不可用。 – Oncaphillis 2014-10-19 17:11:04

+0

你说得对,如果没有连接,'open'应该返回false。我的问题是串口连接。打开新的问题http://stackoverflow.com/questions/26459788/qt-serial-port-write-and-read-data – gr3g 2014-10-20 06:43:35

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

谢谢你的回应。你能给我一个例子吗?我只能在Qt文档中看到* slot *示例;我不需要。像javascript:'setInterval(myFunction,1000);' – gr3g 2014-10-20 13:34:00

+0

在C++中添加示例,因为问题使用C++标记,而不是JavaScript。 – TheDarkKnight 2014-10-20 14:29:01

+0

谢谢!我是Qt中的一个begginer,并且无法将其应用于我的代码... 您能否给我一个简单的示例,用'QApplication :: processEvents'请吗? – gr3g 2014-10-20 15:54:51