diff --git a/.vscode/settings.json b/.vscode/settings.json index ed5bb8f..8096df0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,7 +12,7 @@ "ignoreFailures": true } ], - //"visualizerFile": "${workspaceRoot}/.vscode/qt6.natvis", + "visualizerFile": "${workspaceRoot}/.vscode/qt5.natvis", "args": [] }, "cmake.environment": { diff --git a/ClientCore/ClientCore.cpp b/ClientCore/ClientCore.cpp index 7448ef3..3d89632 100644 --- a/ClientCore/ClientCore.cpp +++ b/ClientCore/ClientCore.cpp @@ -176,6 +176,10 @@ void ClientCore::UseFrame(QSharedPointer frame) emit sigFileInfo(frame); break; } + case FBT_SER_MSG_OFFLINE: { + emit sigOffline(frame); + break; + } default: qCritical() << QString("unknown frame type: %1").arg(frame->type); break; @@ -276,33 +280,11 @@ void HeatBeat::run() continue; } ClientCore::syncInvoke(core_, frame); - } -} - -TransBeat::TransBeat(ClientCore* core, QObject* parent) : QThread(parent), core_(core) -{ -} - -TransBeat::~TransBeat() -{ - Stop(); -} - -void TransBeat::run() -{ - isRun_ = true; - InfoMsg info; - while (isRun_) { - QThread::sleep(1); - if (!core_->IsConnect()) { + auto rid = core_->GetRemoteID(); + if (rid.isEmpty()) { continue; } - auto frame = core_->GetBuffer(info, FBT_SER_MSG_JUDGE_OTHER_ALIVE, core_->GetRemoteID()); - ClientCore::syncInvoke(core_, frame); + auto frame2 = core_->GetBuffer(info, FBT_SER_MSG_JUDGE_OTHER_ALIVE, rid); + ClientCore::syncInvoke(core_, frame2); } -} - -void TransBeat::Stop() -{ - isRun_ = false; -} +} \ No newline at end of file diff --git a/ClientCore/ClientCore.h b/ClientCore/ClientCore.h index 811a428..ef1c7c3 100644 --- a/ClientCore/ClientCore.h +++ b/ClientCore/ClientCore.h @@ -76,6 +76,7 @@ signals: void sigFileBuffer(QSharedPointer frame); void sigTransFailed(QSharedPointer frame); void sigFileInfo(QSharedPointer frame); + void sigOffline(QSharedPointer frame); signals: void conSuccess(); @@ -143,24 +144,4 @@ private: ClientCore* core_{}; }; -// judge send client is alive or not when downloading -class TransBeat : public QThread -{ - Q_OBJECT - -public: - TransBeat(ClientCore* core, QObject* parent = nullptr); - ~TransBeat() override; - -public: - void Stop(); - -protected: - void run() override; - -private: - bool isRun_{false}; - ClientCore* core_{}; -}; - #endif // CLIENTCORE_H \ No newline at end of file diff --git a/ClientCore/FileTrans.cpp b/ClientCore/FileTrans.cpp index 1d97b2a..617b4b0 100644 --- a/ClientCore/FileTrans.cpp +++ b/ClientCore/FileTrans.cpp @@ -17,13 +17,11 @@ FileTrans::FileTrans(ClientCore* clientCore) : clientCore_(clientCore) */ void FileTrans::ReqSendFile(const TransTask& task) { + sendTask_->state = TaskState::STATE_RUNNING; // TODO: check if running... if (sendTask_->file.isOpen()) { - qWarning() << QString(tr("file [%1] is running.")).arg(sendTask_->file.fileName()); - while (sendTask_->file.isOpen()) { - QThread::msleep(1); - } - qWarning() << QString(tr("file [%1] is exit running.")).arg(sendTask_->file.fileName()); + qWarning() << QString(tr("file [%1] is already opened, will auto close.")).arg(sendTask_->file.fileName()); + sendTask_->file.close(); } // start InfoMsg info; @@ -146,6 +144,7 @@ void FileTrans::RegisterSignal() connect(clientCore_, &ClientCore::sigFileBuffer, this, [this](QSharedPointer frame) { fbtFileBuffer(frame); }); connect(clientCore_, &ClientCore::sigFileInfo, this, [this](QSharedPointer frame) { fbtFileInfo(frame); }); connect(clientCore_, &ClientCore::sigTransFailed, this, [this](QSharedPointer frame) { fbtTransFailed(frame); }); + connect(clientCore_, &ClientCore::sigOffline, this, [this](QSharedPointer frame) { fbtInterrupt(frame); }); } // The other party requests to send, prepare to receive. @@ -317,6 +316,18 @@ void FileTrans::fbtTransFailed(QSharedPointer frame) downTask_->state = TaskState::STATE_FAILED; } +void FileTrans::fbtInterrupt(QSharedPointer frame) +{ + if (downTask_->state == TaskState::STATE_RUNNING) { + qWarning() << QString(tr("trans file:%1 interrupt.")).arg(downTask_->file.fileName()); + downTask_->state = TaskState::STATE_NONE; + } + if (sendTask_->state == TaskState::STATE_RUNNING) { + qWarning() << QString(tr("trans file:%1 interrupt.")).arg(sendTask_->file.fileName()); + sendTask_->state = TaskState::STATE_NONE; + } +} + void FileTrans::SendFile(const QSharedPointer& task) { auto* sendThread = new SendThread(clientCore_); diff --git a/ClientCore/FileTrans.h b/ClientCore/FileTrans.h index 552eff3..5d0c3bc 100644 --- a/ClientCore/FileTrans.h +++ b/ClientCore/FileTrans.h @@ -78,6 +78,7 @@ private: void fbtCanotSend(QSharedPointer frame); void fbtCanSend(QSharedPointer frame); void fbtTransFailed(QSharedPointer frame); + void fbtInterrupt(QSharedPointer frame); private: void RegisterSignal(); diff --git a/Gui/Control/ConnectControl.cpp b/Gui/Control/ConnectControl.cpp index d36708c..f7f065c 100644 --- a/Gui/Control/ConnectControl.cpp +++ b/Gui/Control/ConnectControl.cpp @@ -53,6 +53,11 @@ void Connecter::RunWorker(ClientCore* clientCore) clientCore_->SetRemoteID(""); qInfo() << QString(tr("Disconnected.")); }); + connect(clientCore_, &ClientCore::sigOffline, this, [this]() { + ui->elbClient->clear(); + clientCore_->SetRemoteID(""); + RefreshClient(); + }); connect(this, &Connecter::sigDoConnect, clientCore_, &ClientCore::DoConnect); connect(this, &Connecter::sigDisConnect, this, @@ -125,7 +130,7 @@ void Connecter::setState(ConnectState cs) void Connecter::Disconnect() { - qWarning() << QString(tr("Disconnected requeset...")); + qWarning() << QString(tr("Disconnected...")); emit sigDisConnect(); } diff --git a/Gui/Control/FileControl.cpp b/Gui/Control/FileControl.cpp index ab80d7d..951d537 100644 --- a/Gui/Control/FileControl.cpp +++ b/Gui/Control/FileControl.cpp @@ -41,6 +41,8 @@ void FileManager::SetModeStr(const QString& modeStr, int type, ClientCore* clien isRemote_ = true; ui->tableWidget->setIsRemote(true); fileHelper_ = remotePtr; + connect(cliCore_, &ClientCore::sigDisconnect, this, [this]() { ui->tableWidget->setRowCount(0); }); + connect(cliCore_, &ClientCore::sigOffline, this, [this]() { ui->tableWidget->setRowCount(0); }); } ui->tableWidget->setOwnIDCall([this]() { return cliCore_->GetOwnID(); }); diff --git a/Gui/Form/Transform.cpp b/Gui/Form/Transform.cpp index 67a4c5e..dcf0331 100644 --- a/Gui/Form/Transform.cpp +++ b/Gui/Form/Transform.cpp @@ -67,7 +67,7 @@ void TransForm::startTask() break; } emit sigProgress(progress); - QThread::msleep(10); + QThread::msleep(2); } } else { fileTrans_->ReqDownFile(task); @@ -85,7 +85,7 @@ void TransForm::startTask() break; } emit sigProgress(progress); - QThread::msleep(10); + QThread::msleep(2); } } ++curTaskNum_; diff --git a/Server/Server.cpp b/Server/Server.cpp index 67d7387..25b99d9 100644 --- a/Server/Server.cpp +++ b/Server/Server.cpp @@ -8,7 +8,7 @@ #include "InfoPack.hpp" #define NO_HEATBEAT_TIMEOUT (10) -#define MONITOR_HEART_SPED (10 * 1000) +#define MONITOR_HEART_SPED (10 * 2) Server::Server(QObject* parent) : QTcpServer(parent) { @@ -116,7 +116,7 @@ void Server::processClientData(QSharedPointer client) } frame->fid = client->id; if (frame->type <= 30) { - frame->tid = "server"; + //frame->tid = "server"; replyRequest(client, frame); } else { if (!forwardData(client, frame)) {