我目前正在VS2010中实现一个c ++应用程序,它从TCP套接字读取数据并填充数据库。 为了从TCP套接字读取数据,我使用了QT readAll()函数。
QByteArray text = socket.readAll();
我的应用程序不断填充数据库,因此,我需要每5秒左右读取一次数据, 但是readAll()函数在第一次执行后没有读取任何内容(第一次一切正常)。文本的大小是0,而我期望它是75。
我检查了套接字状态并且已连接。 我也检查了错误,似乎没有什么问题。 数据从服务器不断传输(我用wireshark检查了)
我该如何解决这种奇怪的行为? 我怀疑的一件事是while循环,但我想不出任何变通方法
这是我的代码:
#include "stdafx.h"
#include "DataCollectionService.h"
int main(int argv, char **args){
QCoreApplication app(argv, args);
DataCollectionService *newCollection = new DataCollectionService(&app);
QObject::connect(newCollection, SIGNAL(finished()), &app, SLOT(quit()));
return(app.exec());
}
///////////////////////////////////////////////
#pragma once
#ifndef DATACOLLECTION_H
#define DATACOLLECTION_H
#include "TCPClient.h"
#include "MySqlConnection.h"
#include "QtGui\qapplication.h"
#include "QtCore\qobject.h"
#include "QtCore\qtimer.h"
class DataCollectionService: public QObject{
Q_OBJECT
public:
DataCollectionService(QObject *parent = 0) : QObject(parent){
newClient.InitializeTCPConnection();
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(run()));
timer->start(1000);
}
private:
MySqlConnection newConnection;
TCPClient newClient;
private slots:
void run();
signals:
void finished();
};
#endif
////////////////////////////////////////////////////////////////////////////////
void DataCollectionService::run(){
newClient.UpdateMeasurements();
}
////////////////////////////////////////////////////////////////////////////////
void TCPClient::InitializeTCPConnection(){
socket.connectToHost("160.40.1.188", 2078, QIODevice::ReadWrite); ///remote host and port
if(socket.waitForConnected()){
if(!socket.waitForReadyRead()){
transmissionError = true;
}
}
else{
transmissionError = true;
}
}
///////////////////////////////////////////////////////////////////////////////
void TCPClient::UpdateMeasurements(){
transmissionError = false;
QByteArray text = socket.readAll(); ///////this gets data only once!!!
}
答案 0 :(得分:1)
QT应用程序旨在处理事件循环,这些事件发生在QApplication :: exec()
。你不能只运行你的循环,你需要使用QT的机制。
答案 1 :(得分:-1)
终于解决了它。
需要添加
qApp-> processEvents();
在run()函数内部
现在一切正常