придумал вот как и это работает. но видимо сокет ждет 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, то это тоже не работает. что нужно здесь дописать? помогите пожалуйста. Он создаёт файл. принимает от сетевого сервера данные, но видимо время заканчивается, а мне надо, чтобы он работал, пока не скачается.
А, всё, догадался. надо просто в этот поток вставить. но размер не полный передается. это видимо на стороне сервера проблемы
#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();
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть код для деления чисел на наибольший общий множитель:
Проблема заключается в том, что раньше я перегружал таким методом, а с шаблонными функциями это, как я понял, работает по-другомуПодскажите,...
Не могу понять как подтянуть бинарь буста через cmake, заголовки подключаются, но бинарь не находится, что я написал неправильно? В данном примере...