初步完成文件夹传输。

This commit is contained in:
2026-03-25 14:53:24 +08:00
parent 0e397ace7d
commit 7155880ff3
7 changed files with 290 additions and 54 deletions

View File

@@ -12,6 +12,9 @@ void ClientCore::Instance()
socket_ = new QTcpSocket(this);
connect(socket_, &QTcpSocket::readyRead, this, &ClientCore::onReadyRead);
connect(socket_, &QTcpSocket::disconnected, this, &ClientCore::onDisconnected);
clearWaitTimer_ = new QTimer(this);
clearWaitTimer_->setInterval(10000);
connect(clearWaitTimer_, &QTimer::timeout, this, [this]() { clearWaitTask(); });
}
ClientCore::~ClientCore()
@@ -145,11 +148,79 @@ void ClientCore::handleAsk(QSharedPointer<FrameBuffer> frame)
// 这个请求的处理可能是耗时的,需要开线程处理。
if (msg.command == STRMSG_AC_ALL_DIRFILES) {
msg.command = STRMSG_AC_ANSWER_ALL_DIRFILES;
QMutexLocker locker(&waitTaskMut_);
if (waitTask_.contains(frame->fid)) {
msg.msg = STRMSG_ST_COMMAND_ALREADY_RUNNING;
if (!Send<InfoMsg>(msg, FBT_MSGINFO_ANSWER, frame->fid)) {
auto logMsg = tr("") + frame->fid + tr("返回获取文件列表结果消息失败。");
qCritical() << logMsg;
return;
}
} else {
waitTask_[frame->fid] = WaitTask();
auto& wt = waitTask_[frame->fid];
QString fid = frame->fid;
wt.wo = new WaitOperOwn(this);
wt.wo->SetClient(this);
wt.wo->fid = fid;
wt.wo->infoMsg_ = msg;
wt.wo->func_ = [this, &wt, fid]() {
auto& infoMsg = wt.wo->infoMsg_;
infoMsg.command = STRMSG_AC_ANSWER_ALL_DIRFILES;
bool success = false;
//infoMsg.infos.clear();
for (auto& item : infoMsg.infos.keys()) {
auto fullDir = Util::Join(infoMsg.fst.root, item);
if (!DirFileHelper::GetAllFiles(fullDir, infoMsg.list)) {
success = false;
break;
}
auto& vec = infoMsg.infos[item];
for (const auto& dd : std::as_const(infoMsg.list)) {
FileStruct fst;
fst.root = infoMsg.fst.root;
fst.mid = item;
fst.relative = dd;
vec.push_back(fst);
}
}
return success;
};
wt.wo->start();
}
return;
}
// 未知信息
qWarning() << QString(tr("未知询问信息类型:%1")).arg(msg.command);
}
void ClientCore::clearWaitTask()
{
QMutexLocker locker(&waitTaskMut_);
QList<QString> completedTasks;
for (auto it = waitTask_.begin(); it != waitTask_.end(); ++it) {
WaitTask& task = it.value();
if (task.wo && task.wo->isFinished()) {
completedTasks.append(it.key());
}
}
for (const QString& taskId : completedTasks) {
auto it = waitTask_.find(taskId);
if (it != waitTask_.end()) {
WaitTask& task = it.value();
if (task.wo) {
task.wo->wait();
delete task.wo;
task.wo = nullptr;
}
waitTask_.erase(it);
qDebug() << "清理完成的任务:" << taskId;
}
}
}
void ClientCore::UseFrame(QSharedPointer<FrameBuffer> frame)
{
switch (frame->type) {
@@ -430,13 +501,12 @@ void WaitOper::run()
isRun_ = true;
recvMsg_ = false;
InfoMsg msg;
msg.command = sendStrType_;
msg.fromPath = stra_;
msg.toPath = strb_;
msg.type = type_;
infoMsg_.command = sendStrType_;
infoMsg_.fromPath = stra_;
infoMsg_.toPath = strb_;
infoMsg_.type = type_;
auto f = cli_->GetBuffer<InfoMsg>(msg, FBT_MSGINFO_ASK, cli_->GetRemoteID());
auto f = cli_->GetBuffer<InfoMsg>(infoMsg_, FBT_MSGINFO_ASK, cli_->GetRemoteID());
if (!ClientCore::syncInvoke(cli_, f)) {
auto errMsg = QString(tr("向%1发送%2请求失败。")).arg(cli_->GetRemoteID()).arg(sendStrType_);
emit sigCheckOver();
@@ -473,7 +543,12 @@ void WaitOper::SetPath(const QString& stra, const QString& strb, const QString&
type_ = type;
}
InfoMsg WaitOper::GetMsg() const
InfoMsg WaitOper::GetMsgConst() const
{
return infoMsg_;
}
InfoMsg& WaitOper::GetMsgRef()
{
return infoMsg_;
}
@@ -502,12 +577,19 @@ WaitOperOwn::WaitOperOwn(QObject* parent) : WaitThread(parent)
void WaitOperOwn::run()
{
auto execRet = false;
if (func_) {
func_();
execRet = func_();
}
if (!fid.isEmpty()) {
if (!cli_->syncInvoke(cli_, cli_->GetBuffer<InfoMsg>(infoMsg_, FBT_MSGINFO_ANSWER, fid))) {
qCritical() << QString(tr("向%1发送%2请求失败。")).arg(fid).arg(infoMsg_.command);
}
}
emit sigOver();
}
void WaitOperOwn::recvFrame(QSharedPointer<FrameBuffer> frame)
{
qDebug() << "不应该被调用的地方:" << __FUNCTION__;
}

View File

@@ -15,8 +15,14 @@
#include <QReadWriteLock>
#include <QTcpSocket>
#include <QThread>
#include <QTimer>
#include <array>
class WaitOperOwn;
struct WaitTask {
QString id;
WaitOperOwn* wo;
};
class ClientCore : public QObject
{
Q_OBJECT
@@ -93,6 +99,7 @@ private:
void onReadyRead();
void onDisconnected();
void handleAsk(QSharedPointer<FrameBuffer> frame);
void clearWaitTask();
private:
void UseFrame(QSharedPointer<FrameBuffer> frame);
@@ -121,6 +128,10 @@ public:
bool connected_{false};
LocalFile localFile_;
QTimer* clearWaitTimer_{};
QMutex waitTaskMut_;
QMap<QString, WaitTask> waitTask_;
};
// 工作线程。
@@ -194,7 +205,8 @@ public:
void run() override;
void SetType(const QString& sendType, const QString& ansType);
void SetPath(const QString& stra, const QString& strb, const QString& type);
InfoMsg GetMsg() const;
InfoMsg GetMsgConst() const;
InfoMsg& GetMsgRef();
void interrupCheck() override;
void recvFrame(QSharedPointer<FrameBuffer> frame) override;
@@ -224,8 +236,9 @@ public:
void recvFrame(QSharedPointer<FrameBuffer> frame) override;
public:
QString fid;
InfoMsg infoMsg_{};
std::function<void()> func_;
std::function<bool()> func_;
};
#endif // CLIENTCORE_H