Попытка оптимизации

This commit is contained in:
2026-02-24 10:10:59 +03:00
parent a3651496b7
commit eb95db696a
2 changed files with 258 additions and 244 deletions

View File

@@ -5,10 +5,11 @@ RecognizeSystem::RecognizeSystem(QObject *parent):
QObject(parent), QObject(parent),
versionContainer(nullptr), versionContainer(nullptr),
dataParser(nullptr), dataParser(nullptr),
postProcessorSystem(nullptr) postProcessorSystem(nullptr),
client(nullptr)
{ {
packetType = PacketType::TYPE_NONE; packetType = PacketType::TYPE_NONE;
filePath.clear(); filePath = "";
fileSize = 0; fileSize = 0;
sizeReceiveData = 0; sizeReceiveData = 0;
tmpBlock.clear(); tmpBlock.clear();
@@ -18,68 +19,75 @@ RecognizeSystem::RecognizeSystem(QObject *parent):
void RecognizeSystem::initialize(DataParser *dataParser, VersionContainer *versionContainer,PostProcessorSystem *postProcessorSystem,Client *client) void RecognizeSystem::initialize(DataParser *dataParser, VersionContainer *versionContainer,PostProcessorSystem *postProcessorSystem,Client *client)
{ {
this->versionContainer = versionContainer; this->versionContainer = versionContainer;
this->postProcessorSystem = postProcessorSystem;
this->dataParser = dataParser; this->dataParser = dataParser;
this->postProcessorSystem = postProcessorSystem;
this->client = client; this->client = client;
} }
const int BLOCK_SIZE = 1024 * 1024; // Размер блока
void RecognizeSystem::recognize(QTcpSocket *socket) void RecognizeSystem::recognize(QTcpSocket *socket)
{ {
qDebug() << "RecognizeThreadId " << QThread::currentThreadId(); //qDebug() << "RecognizeThreadId " << QThread::currentThreadId();
QDataStream stream(socket); QDataStream stream(socket);
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion); stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
while(socket->bytesAvailable()) while(socket->bytesAvailable())
{ {
if (socket->state() != QTcpSocket::ConnectedState)
{
qDebug() << "RecognizeSystem::recognize socket->state() != QTcpSocket::ConnectedState";
return;
}
if (socket->state() != QTcpSocket::ConnectedState) return; /*
if(!socket->waitForReadyRead(TCP_READ_TIMEOUT))
if(packetType == PacketType::TYPE_NONE){ //определение первичного пакета {
continue;
}
*/
switch ((int)packetType)
{
case PacketType::TYPE_NONE: //определение первичного пакета
{
stream.startTransaction(); stream.startTransaction();
stream >> packetType; stream >> packetType;
if(!stream.commitTransaction()) if(!stream.commitTransaction())
{ {
emit sigSendDebugLog(Tools::getTime() + " CLIENT: packetType - FAIL commitTransaction"); socket->waitForReadyRead(TCP_READ_TIMEOUT);
continue;
if(socket->waitForReadyRead(TCP_READ_TIMEOUT)){ }
emit sigSendDebugLog("ERROR: PACKET TYPE READ TIMEOUT"); //qDebug() << Tools::GetTime() << "CLIENT: type: " << packetType;
return;
} }
continue; continue;
} case PacketType::TYPE_FOLDER: //создание папок
{
//qDebug() << Tools::GetTime() << "CLIENT: type: " << packetType;
}
if(packetType == PacketType::TYPE_FOLDER){ //создание папок
stream.startTransaction(); stream.startTransaction();
stream >> filePath; stream >> filePath;
if(!stream.commitTransaction()){ if(!stream.commitTransaction())
{
continue; continue;
} }
filePath = Tools::createReceiveFullPath(filePath,versionContainer->getServerVersionData()); filePath = Tools::createReceiveFullPath(filePath,versionContainer->getServerVersionData());
QDir dir(filePath); QDir dir(filePath);
if(!dir.exists()){ if(!dir.exists())
if(dir.mkpath(filePath)){ {
qDebug() << "Dir Created"; if(dir.mkpath(filePath))
{
qDebug() << "Dir Created: " << filePath;
} }
} }
packetType = PacketType::TYPE_NONE;
emit sigUpdateBytesAvailable(); emit sigUpdateBytesAvailable();
continue;
} }
break;
if(packetType == PacketType::TYPE_FILE) //загрузка файлов case PacketType::TYPE_FILE: //загрузка файлов
{ {
//ПОЛУЧЕНИЕ ПУТИ //ПОЛУЧЕНИЕ ПУТИ
//ПОЛУЧЕНИЕ РАЗМЕРА ФАЙЛА //ПОЛУЧЕНИЕ РАЗМЕРА ФАЙЛА
@@ -89,15 +97,10 @@ void RecognizeSystem::recognize(QTcpSocket *socket)
stream >> filePath; stream >> filePath;
stream >> fileSize; stream >> fileSize;
if(!stream.commitTransaction()){ if(!stream.commitTransaction())
{
emit sigSendDebugLog(Tools::getTime() + "CLIENT: filePath, fileSize - FAIL commitTransaction"); emit sigSendDebugLog(Tools::getTime() + "CLIENT: filePath, fileSize - FAIL commitTransaction");
if (!socket->waitForReadyRead(TCP_READ_TIMEOUT)) {
emit sigSendDebugLog(Tools::getTime() + "CLIENT: ERROR! readyRead timeout - filePath, fileSize!!!");
return;
}
continue; continue;
} }
filePath = Tools::createReceiveFullPath(filePath,versionContainer->getServerVersionData()); filePath = Tools::createReceiveFullPath(filePath,versionContainer->getServerVersionData());
@@ -105,11 +108,10 @@ void RecognizeSystem::recognize(QTcpSocket *socket)
emit sigSendDebugLog("CLIENT: filesize: " + QString::number(fileSize)); emit sigSendDebugLog("CLIENT: filesize: " + QString::number(fileSize));
emit sigSendDebugLog("CLIENT: filePath: " + filePath); emit sigSendDebugLog("CLIENT: filePath: " + filePath);
socket->waitForReadyRead(100); //socket->waitForReadyRead(100);
break; break;
} }
//ПОЛУЧЕНИЕ САМОГО ФАЙЛА //ПОЛУЧЕНИЕ САМОГО ФАЙЛА
emit sigSendDebugLog(Tools::getTime() + "AfterRead size and path BytesAvailable: " + socket->bytesAvailable()); emit sigSendDebugLog(Tools::getTime() + "AfterRead size and path BytesAvailable: " + socket->bytesAvailable());
@@ -120,7 +122,8 @@ void RecognizeSystem::recognize(QTcpSocket *socket)
{ {
file.remove(); //удаление файла, если он уже есть, но необходимо обновить file.remove(); //удаление файла, если он уже есть, но необходимо обновить
emit sigSendDebugLog(Tools::getTime() + "Delete exist file: " + filePath); emit sigSendDebugLog(Tools::getTime() + "Delete exist file: " + filePath);
socket->waitForReadyRead(100);
//socket->waitForReadyRead(100);
} }
tmpBlock.clear(); tmpBlock.clear();
@@ -130,22 +133,18 @@ void RecognizeSystem::recognize(QTcpSocket *socket)
file.open(QFile::WriteOnly); file.open(QFile::WriteOnly);
if(! file.isOpen()) if(! file.isOpen())
{ QMessageBox::critical(nullptr, "P1", "isOpen false. File: " + file.fileName());
int marker = 0;
QMessageBox::critical(nullptr, "P31", "POINT 31");
}
if(! file.isWritable()) if(! file.isWritable())
{ QMessageBox::critical(nullptr, "P2", "isWritable false. File: " + file.fileName());
int marker = 0;
QMessageBox::critical(nullptr, "P32", "POINT 32");
}
while(true) while(true)
{ {
socket->waitForReadyRead(10);
if(socket->bytesAvailable() <= 0) if(socket->bytesAvailable() <= 0)
{
socket->waitForReadyRead(TCP_READ_TIMEOUT);
continue; continue;
}
if(fileSize - sizeReceiveData >= BLOCK_SIZE) if(fileSize - sizeReceiveData >= BLOCK_SIZE)
tmpBlock = socket->read(BLOCK_SIZE); tmpBlock = socket->read(BLOCK_SIZE);
@@ -155,7 +154,10 @@ void RecognizeSystem::recognize(QTcpSocket *socket)
qint64 bytesReceived = tmpBlock.length(); qint64 bytesReceived = tmpBlock.length();
if(bytesReceived <= 0) if(bytesReceived <= 0)
{
QMessageBox::critical(nullptr, "P3", "bytesReceived <= 0. File: " + file.fileName());
continue; continue;
}
sizeReceiveData += bytesReceived; sizeReceiveData += bytesReceived;
countSend++; countSend++;
@@ -165,8 +167,8 @@ void RecognizeSystem::recognize(QTcpSocket *socket)
if(toFile <= 0) if(toFile <= 0)
{ {
//emit sigUpdateBytesAvailable(); //emit sigUpdateBytesAvailable();
QMessageBox::critical(nullptr, "P2", "POINT 33"); QMessageBox::critical(nullptr, "P4", "write toFile <= 0. File: " + file.fileName());
break; continue;
} }
tmpBlock.clear(); tmpBlock.clear();
@@ -181,8 +183,7 @@ void RecognizeSystem::recognize(QTcpSocket *socket)
} }
else if(sizeReceiveData > fileSize) else if(sizeReceiveData > fileSize)
{ {
int marker = 0; QMessageBox::critical(nullptr, "P5", "sizeReceiveData > fileSize");
QMessageBox::critical(nullptr, "P40", "POINT 34");
} }
} }
@@ -197,13 +198,15 @@ void RecognizeSystem::recognize(QTcpSocket *socket)
sizeReceiveData = 0; sizeReceiveData = 0;
countSend = 0; countSend = 0;
} }
break;
if(packetType == PacketType::TYPE_DELETE) //удаление лишних файлов (рекурсивно удаляет все содежимое) case PacketType::TYPE_DELETE: //удаление лишних файлов (рекурсивно удаляет все содежимое)
{ {
stream.startTransaction(); stream.startTransaction();
stream >> filePath; stream >> filePath;
if(!stream.commitTransaction()){ if(!stream.commitTransaction())
{
continue; continue;
} }
@@ -211,7 +214,6 @@ void RecognizeSystem::recognize(QTcpSocket *socket)
QFileInfo fileInfo(filePath); QFileInfo fileInfo(filePath);
if(fileInfo.exists()) if(fileInfo.exists())
{ {
if(fileInfo.isFile()) if(fileInfo.isFile())
@@ -220,22 +222,19 @@ void RecognizeSystem::recognize(QTcpSocket *socket)
file.remove(); file.remove();
} }
if(fileInfo.isDir()){ if(fileInfo.isDir())
{
QDir dir(filePath); QDir dir(filePath);
dir.removeRecursively(); dir.removeRecursively();
} }
qDebug() << Tools::getTime() << "Deleted: " << filePath; qDebug() << Tools::getTime() << "Deleted: " << filePath;
} }
packetType = PacketType::TYPE_NONE;
continue;
} }
break;
if(packetType == PacketType::TYPE_NEEDUPDATE) case PacketType::TYPE_NEEDUPDATE: //нужно обновление
{ //нужно обновление {
bool flag = false; bool flag = false;
quint64 size = 0; quint64 size = 0;
quint64 fileCount = 0; quint64 fileCount = 0;
@@ -247,62 +246,73 @@ void RecognizeSystem::recognize(QTcpSocket *socket)
stream >> fileCount; stream >> fileCount;
stream >> fileDelete; stream >> fileDelete;
if(!stream.commitTransaction()){ if(!stream.commitTransaction())
{
continue; continue;
} }
emit sigNeedUpdate(flag,size,fileCount,fileDelete); emit sigNeedUpdate(flag,size,fileCount,fileDelete);
packetType = PacketType::TYPE_NONE;
} }
break;
if(packetType == PacketType::TYPE_XMLANSWER){ //ответы формата XML case PacketType::TYPE_XMLANSWER: //ответы формата XML
{
QByteArray array; QByteArray array;
stream.startTransaction(); stream.startTransaction();
stream >> array; stream >> array;
if(!stream.commitTransaction()){ if(!stream.commitTransaction())
{
continue; continue;
} }
dataParser->xmlParser(array); dataParser->xmlParser(array);
packetType = PacketType::TYPE_NONE;
} }
break;
if(packetType == PacketType::HASH_READY) case PacketType::HASH_READY:
{ {
emit sigCheckUpdate(); emit sigCheckUpdate();
} }
break;
if(packetType == PacketType::RECALCULATE_HASH) case PacketType::RECALCULATE_HASH:
{ {
emit sigdRecalculateHashOnServerState(); emit sigdRecalculateHashOnServerState();
} }
break;
if(packetType == PacketType::BUSY) case PacketType::BUSY:
{ {
emit sigAnimationActivated(true); emit sigAnimationActivated(true);
} }
break;
if(packetType == PacketType::FREE) case PacketType::FREE:
{ {
emit sigAnimationActivated(false); emit sigAnimationActivated(false);
} }
break;
if (packetType == PacketType::TYPE_XMLANSWER_DOCS_CHANGED) //на случай общего обновления case PacketType::TYPE_XMLANSWER_DOCS_CHANGED: //на случай общего обновления
{ {
if (client->getIsLoggedIn()) if (client->getIsLoggedIn())
{ {
emit sigSendPacketType(PacketType::GET_DOCS); emit sigSendPacketType(PacketType::GET_DOCS);
} }
} }
break;
if (packetType == PacketType::UPDATE_FILE_COMPLETE) case PacketType::UPDATE_FILE_COMPLETE:
{ {
postProcessorSystem->calculateCommonHash(); postProcessorSystem->calculateCommonHash();
emit sigLoadComplete(); emit sigLoadComplete();
emit sigSendPacketType(PacketType::GET_DOCS); emit sigSendPacketType(PacketType::GET_DOCS);
packetType = PacketType::TYPE_NONE; }
break;
default:
qCritical() << "RecognizeSystem::recognize packetType unknown!";
} }
packetType = PacketType::TYPE_NONE; packetType = PacketType::TYPE_NONE;

View File

@@ -14,6 +14,8 @@
#include <Data\streamingversiondata.h> #include <Data\streamingversiondata.h>
#include <Core\hashcomparer.h> #include <Core\hashcomparer.h>
const int BLOCK_SIZE = 1024 * 1024; // Размер блока
class RecognizeSystem : public QObject class RecognizeSystem : public QObject
{ {
Q_OBJECT Q_OBJECT
@@ -21,8 +23,10 @@ class RecognizeSystem : public QObject
public: public:
explicit RecognizeSystem(QObject *parent = 0); explicit RecognizeSystem(QObject *parent = 0);
~RecognizeSystem(){}; ~RecognizeSystem(){};
void initialize(DataParser *dataParser, VersionContainer* versionContainer,PostProcessorSystem *postProcessorSystem,Client *client); void initialize(DataParser *dataParser, VersionContainer* versionContainer,PostProcessorSystem *postProcessorSystem,Client *client);
void recognize(QTcpSocket *socket); void recognize(QTcpSocket *socket);
signals: signals:
void sigUpdateBytesAvailable(); void sigUpdateBytesAvailable();
void sigLoadComplete(); void sigLoadComplete();
@@ -40,13 +44,13 @@ private:
VersionContainer *versionContainer; VersionContainer *versionContainer;
DataParser *dataParser; DataParser *dataParser;
PostProcessorSystem *postProcessorSystem; PostProcessorSystem *postProcessorSystem;
PacketType packetType;
QString filePath;
QByteArray tmpBlock;
Client *client; Client *client;
qint64 sizeReceiveData; PacketType packetType;
QString filePath;
qint64 fileSize; qint64 fileSize;
qint64 sizeReceiveData;
QByteArray tmpBlock;
int countSend; int countSend;
}; };