From 03f157f620396fc0b132c12c6cfecfba6be15bfa Mon Sep 17 00:00:00 2001 From: RigoLigoRLC Date: Thu, 17 Feb 2022 23:27:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BF=AB=E9=80=9F=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E4=B8=8B=E8=BD=BD=E6=97=B6=E4=BA=A7=E7=94=9F=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=AB=9E=E4=BA=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mNextDownloadId没来得及自增就被再次使用导致下载出现问题 --- gui/page/spkpagedownloads.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/gui/page/spkpagedownloads.cpp b/gui/page/spkpagedownloads.cpp index b658248..0e6ffd5 100644 --- a/gui/page/spkpagedownloads.cpp +++ b/gui/page/spkpagedownloads.cpp @@ -26,7 +26,7 @@ SpkUi::SpkPageDownloads::SpkPageDownloads(QWidget *parent) : mCurrentStatus = Idle; connect(mDownloadMgr, &SpkDownloadMgr::DownloadStopped, - this, &SpkPageDownloads::DownloadStopped); + this, &SpkPageDownloads::DownloadStopped, Qt::QueuedConnection); } SpkUi::SpkPageDownloads::~SpkPageDownloads() @@ -58,23 +58,26 @@ void SpkUi::SpkPageDownloads::AddDownloadTask(QString name, QString pkgName, QSt icon.load(":/icons/broken-icon.svg"); entry->SetBasicInfo(name, icon); entry->SetStatus(SpkDownloadEntry::Waiting); + auto id = mNextDownloadId; - mEntries[mNextDownloadId] = entry; + mNextDownloadId++; + + mEntries[id] = entry; mLayEntries->addWidget(entry); if(mCurrentStatus != Idle) - mWaitingDownloads.enqueue({ mNextDownloadId, path }); // Queue download task for future + mWaitingDownloads.enqueue({ id, path }); // Queue download task for future else { - if(!mDownloadMgr->StartNewDownload(path, mNextDownloadId)) // Initiate a download task when idle - emit mDownloadMgr->DownloadStopped(SpkDownloadMgr::FailNoVaibleServer, mNextDownloadId); - else + mCurrentStatus = Waiting; + if(!mDownloadMgr->StartNewDownload(path, id)) // Initiate a download task when idle { - mCurrentStatus = Waiting; + // If fails to start then try next one. Emitting this signal causes + // SpkPageDownloads::DownloadStopped to be activated and thus tries next item in queue + emit mDownloadMgr->DownloadStopped(SpkDownloadMgr::FailNoVaibleServer, id); } } - mNextDownloadId++; } void SpkUi::SpkPageDownloads::DownloadStopped(SpkDownloadMgr::TaskResult status, int id)