Convert queue to while loop.

Took 19 seconds
This commit is contained in:
Lukas Brübach 2026-06-14 08:45:47 +02:00
parent bba5b775ec
commit 5c021f0aad

View file

@ -79,17 +79,13 @@ void UserCardArtProvider::processQueue()
return; return;
} }
if (queue.isEmpty()) { while (!queue.isEmpty()) {
return;
}
const QString key = queue.dequeue(); const QString key = queue.dequeue();
const QStringList parts = key.split(u'|'); const QStringList parts = key.split(u'|');
if (parts.size() != 2) { if (parts.size() != 2) {
pending.remove(key); pending.remove(key);
processQueue(); continue;
return;
} }
const QString userName = parts.at(0); const QString userName = parts.at(0);
@ -99,32 +95,33 @@ void UserCardArtProvider::processQueue()
if (!card) { if (!card) {
pending.remove(key); pending.remove(key);
processQueue(); continue;
return;
} }
QPixmap fullRes; QPixmap fullRes;
CardPictureLoader::getPixmap(fullRes, card, QSize(745, 1040)); CardPictureLoader::getPixmap(fullRes, card, QSize(745, 1040));
// If already available, store immediately // Synchronous hit (already loaded/on disk)
if (!fullRes.isNull()) { if (!fullRes.isNull()) {
insertIntoCache(key, cropCardArt(fullRes)); insertIntoCache(key, cropCardArt(fullRes));
pending.remove(key); pending.remove(key);
emit cardArtUpdated(userName); emit cardArtUpdated(userName);
processQueue(); continue;
return;
} }
// Otherwise wait for async load // Async load required.
QPointer<UserCardArtProvider> self(this); QPointer<UserCardArtProvider> self(this);
connect(card.getCardPtr().data(), &CardInfo::pixmapUpdated, this, [self, key, userName, card]() mutable { auto conn = std::make_shared<QMetaObject::Connection>();
*conn = connect(card.getCardPtr().data(), &CardInfo::pixmapUpdated, this,
[self, key, userName, card, conn]() mutable {
if (!self) { if (!self) {
return; return;
} }
disconnect(card.getCardPtr().data(), &CardInfo::pixmapUpdated, self, nullptr); QObject::disconnect(*conn);
QPixmap fullRes; QPixmap fullRes;
CardPictureLoader::getPixmap(fullRes, card, QSize(745, 1040)); CardPictureLoader::getPixmap(fullRes, card, QSize(745, 1040));
@ -138,6 +135,12 @@ void UserCardArtProvider::processQueue()
self->pending.remove(key); self->pending.remove(key);
emit self->cardArtUpdated(userName); emit self->cardArtUpdated(userName);
// Resume processing remaining queued items.
self->processQueue(); self->processQueue();
}); });
// Stop here. We'll continue when the async load finishes.
return;
}
} }