修复快速点击下载时产生的数据竞争

mNextDownloadId没来得及自增就被再次使用导致下载出现问题
This commit is contained in:
RigoLigoRLC 2022-02-17 23:27:19 +08:00
parent 8f8f479873
commit 03f157f620

View File

@ -26,7 +26,7 @@ SpkUi::SpkPageDownloads::SpkPageDownloads(QWidget *parent) :
mCurrentStatus = Idle; mCurrentStatus = Idle;
connect(mDownloadMgr, &SpkDownloadMgr::DownloadStopped, connect(mDownloadMgr, &SpkDownloadMgr::DownloadStopped,
this, &SpkPageDownloads::DownloadStopped); this, &SpkPageDownloads::DownloadStopped, Qt::QueuedConnection);
} }
SpkUi::SpkPageDownloads::~SpkPageDownloads() SpkUi::SpkPageDownloads::~SpkPageDownloads()
@ -58,23 +58,26 @@ void SpkUi::SpkPageDownloads::AddDownloadTask(QString name, QString pkgName, QSt
icon.load(":/icons/broken-icon.svg"); icon.load(":/icons/broken-icon.svg");
entry->SetBasicInfo(name, icon); entry->SetBasicInfo(name, icon);
entry->SetStatus(SpkDownloadEntry::Waiting); entry->SetStatus(SpkDownloadEntry::Waiting);
auto id = mNextDownloadId;
mEntries[mNextDownloadId] = entry; mNextDownloadId++;
mEntries[id] = entry;
mLayEntries->addWidget(entry); mLayEntries->addWidget(entry);
if(mCurrentStatus != Idle) if(mCurrentStatus != Idle)
mWaitingDownloads.enqueue({ mNextDownloadId, path }); // Queue download task for future mWaitingDownloads.enqueue({ id, path }); // Queue download task for future
else else
{ {
if(!mDownloadMgr->StartNewDownload(path, mNextDownloadId)) // Initiate a download task when idle mCurrentStatus = Waiting;
emit mDownloadMgr->DownloadStopped(SpkDownloadMgr::FailNoVaibleServer, mNextDownloadId); if(!mDownloadMgr->StartNewDownload(path, id)) // Initiate a download task when idle
else
{ {
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) void SpkUi::SpkPageDownloads::DownloadStopped(SpkDownloadMgr::TaskResult status, int id)