使用QTCPSocket readAll()函数的奇怪行为

时间:2014-09-26 12:40:46

标签: c++ qt sockets

我目前正在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!!!
}

2 个答案:

答案 0 :(得分:1)

QT应用程序旨在处理事件循环,这些事件发生在QApplication :: exec()。你不能只运行你的循环,你需要使用QT的机制。

答案 1 :(得分:-1)

终于解决了它。

需要添加

qApp-> processEvents();

在run()函数内部

现在一切正常