Как это сделать в qt QTcpSocket и отдельный поток

276
09 июля 2022, 12:10

придумал вот как и это работает. но видимо сокет ждет 30 секунд, а потом обрывает связь. и ещё проблема в том, что окно не рисуется, хотя поток вроде отдельный. я всё также наследую класс от thread.

#include "updater.h"
#include "version.h"

Updater::Updater(QWidget *parent) : QThread(parent)
{
}
void Updater::run()
{
    sock = new QTcpSocket(nullptr);
    qDebug() << "run";
    connect(sock,SIGNAL(connected()), this, SLOT(connected_to_server()));
    sock->connectToHost("localhost", 9336, QIODevice::ReadWrite);
    sock->waitForConnected();

}
void Updater::connected_to_server()
{
    QJsonObject data;
    data["command"] = "update";
    data["os"] = "windows";
    data["version"] = PLAYER_VERSION;
    QJsonDocument doc(data);
    QByteArray byte_data = doc.toJson(QJsonDocument::Compact);
    qDebug() << byte_data;
    sock->write(byte_data,byte_data.length());
    sock->waitForBytesWritten();
    sock->waitForReadyRead();
    char qdata[16386];
    int ret = sock->read(qdata, 16386);
    qdata[ret] = 0;
    qDebug() << "read data: " << qdata << "ret: " << ret;
    QJsonDocument jsonDoc = QJsonDocument::fromJson(qdata,nullptr);
    qDebug() << jsonDoc.toJson();
    QJsonObject object = jsonDoc.object();
    if(object["done"].toBool() == true) {
        return;
    }
    QString file_path = object["file"].toString();
    unsigned long long size = object.value("size").toVariant().toULongLong();
    QFile file(file_path);
    qDebug() << "file " << file_path << " size: " << size;
    if(file.open( QIODevice::WriteOnly | QIODevice::Truncate)) {
        while ( size > 0 ) {
            sock->waitForReadyRead();
            int ret = sock->read(qdata, 16385);
            qDebug() << "ret: " << ret << " size: " << size;
            if ( ret <= 0) break;
            file.write(qdata, ret);
            size -= ret;
        }
        file.close();
    }
    sock->close();
}

а вот как создаю.

    updater = new Updater(nullptr);
    updater->start();

видимо истекает функция waitForConnected, и поток заканчивается. но если написать wait, то это тоже не работает. что нужно здесь дописать? помогите пожалуйста. Он создаёт файл. принимает от сетевого сервера данные, но видимо время заканчивается, а мне надо, чтобы он работал, пока не скачается.

Answer 1

А, всё, догадался. надо просто в этот поток вставить. но размер не полный передается. это видимо на стороне сервера проблемы

#include "updater.h"
#include "version.h"

Updater::Updater(QWidget *parent) : QThread(parent)
{
}
void Updater::run()
{
    sock = new QTcpSocket(nullptr);
    qDebug() << "run";
    sock->connectToHost("localhost", 9336, QIODevice::ReadWrite);
    sock->waitForConnected();
    QJsonObject data;
    data["command"] = "update";
    data["os"] = "windows";
    data["version"] = PLAYER_VERSION;
    QJsonDocument doc(data);
    QByteArray byte_data = doc.toJson(QJsonDocument::Compact);
    qDebug() << byte_data;
    sock->write(byte_data,byte_data.length());
    sock->waitForBytesWritten();
    sock->waitForReadyRead();
    char qdata[16386];
    int ret = sock->read(qdata, 16386);
    qdata[ret] = 0;
    qDebug() << "read data: " << qdata << "ret: " << ret;
    QJsonDocument jsonDoc = QJsonDocument::fromJson(qdata,nullptr);
    qDebug() << jsonDoc.toJson();
    QJsonObject object = jsonDoc.object();
    if(object["done"].toBool() == true) {
        return;
    }
    QString file_path = object["file"].toString();
    unsigned long long size = object.value("size").toVariant().toULongLong();
    QFile file(file_path);
    qDebug() << "file " << file_path << " size: " << size;
    if(file.open( QIODevice::WriteOnly | QIODevice::Truncate)) {
        while ( size > 0 ) {
            sock->waitForReadyRead();
            int ret = sock->read(qdata, 16385);
            qDebug() << "ret: " << ret << " size: " << size;
            if ( ret <= 0) break;
            file.write(qdata, ret);
            size -= ret;
        }
        file.close();
    }
    sock->close();
}

READ ALSO
Ошибка Floating point exception (core dumped)

Ошибка Floating point exception (core dumped)

Есть код для деления чисел на наибольший общий множитель:

323
Не могу перегрузить оператор +

Не могу перегрузить оператор +

Проблема заключается в том, что раньше я перегружал таким методом, а с шаблонными функциями это, как я понял, работает по-другомуПодскажите,...

224
Как добавить boost thread через cmake?

Как добавить boost thread через cmake?

Не могу понять как подтянуть бинарь буста через cmake, заголовки подключаются, но бинарь не находится, что я написал неправильно? В данном примере...

238