Use QThreadPool for torrent creation

The change is in preparation for adding the possibility to create
torrent files via the API.

Rework TorrentCreatorThread to be a more lightweight QRunnable class.
The parameters are now defined on construction time and are fixed
throughout the lifecycle of the TorrentCreator. The lifecycle of the
object is not bound to the one of QDialog anymore; it is now handled
by the QThreadPool. This will enable easier queueing of multiple torrent
creation jobs without risk of spawning many threads.

PR #19500.
This commit is contained in:
rcarpa
2023-08-26 18:27:11 +02:00
committed by GitHub
parent 9ab8203c8a
commit bbac94cc95
5 changed files with 50 additions and 40 deletions

View File

@@ -59,7 +59,7 @@ namespace
TorrentCreatorDialog::TorrentCreatorDialog(QWidget *parent, const Path &defaultPath)
: QDialog(parent)
, m_ui(new Ui::TorrentCreatorDialog)
, m_creatorThread(new BitTorrent::TorrentCreatorThread(this))
, m_threadPool(this)
, m_storeDialogSize(SETTINGS_KEY(u"Size"_s))
, m_storePieceSize(SETTINGS_KEY(u"PieceSize"_s))
, m_storePrivateTorrent(SETTINGS_KEY(u"PrivateTorrent"_s))
@@ -90,13 +90,11 @@ TorrentCreatorDialog::TorrentCreatorDialog(QWidget *parent, const Path &defaultP
connect(m_ui->buttonCalcTotalPieces, &QPushButton::clicked, this, &TorrentCreatorDialog::updatePiecesCount);
connect(m_ui->checkStartSeeding, &QCheckBox::clicked, m_ui->checkIgnoreShareLimits, &QWidget::setEnabled);
connect(m_creatorThread, &BitTorrent::TorrentCreatorThread::creationSuccess, this, &TorrentCreatorDialog::handleCreationSuccess);
connect(m_creatorThread, &BitTorrent::TorrentCreatorThread::creationFailure, this, &TorrentCreatorDialog::handleCreationFailure);
connect(m_creatorThread, &BitTorrent::TorrentCreatorThread::updateProgress, this, &TorrentCreatorDialog::updateProgressBar);
loadSettings();
updateInputPath(defaultPath);
m_threadPool.setMaxThreadCount(1);
#ifdef QBT_USES_LIBTORRENT2
m_ui->checkOptimizeAlignment->hide();
#else
@@ -233,8 +231,14 @@ void TorrentCreatorDialog::onCreateButtonClicked()
, m_ui->URLSeedsList->toPlainText().split(u'\n', Qt::SkipEmptyParts)
};
// run the creator thread
m_creatorThread->create(params);
auto *torrentCreator = new BitTorrent::TorrentCreator(params);
connect(this, &QDialog::rejected, torrentCreator, &BitTorrent::TorrentCreator::requestInterruption);
connect(torrentCreator, &BitTorrent::TorrentCreator::creationSuccess, this, &TorrentCreatorDialog::handleCreationSuccess);
connect(torrentCreator, &BitTorrent::TorrentCreator::creationFailure, this, &TorrentCreatorDialog::handleCreationFailure);
connect(torrentCreator, &BitTorrent::TorrentCreator::updateProgress, this, &TorrentCreatorDialog::updateProgressBar);
// run the torrentCreator in a thread
m_threadPool.start(torrentCreator);
}
void TorrentCreatorDialog::handleCreationFailure(const QString &msg)
@@ -286,11 +290,11 @@ void TorrentCreatorDialog::updatePiecesCount()
{
const Path path = m_ui->textInputPath->selectedPath();
#ifdef QBT_USES_LIBTORRENT2
const int count = BitTorrent::TorrentCreatorThread::calculateTotalPieces(
const int count = BitTorrent::TorrentCreator::calculateTotalPieces(
path, getPieceSize(), getTorrentFormat());
#else
const bool isAlignmentOptimized = m_ui->checkOptimizeAlignment->isChecked();
const int count = BitTorrent::TorrentCreatorThread::calculateTotalPieces(path
const int count = BitTorrent::TorrentCreator::calculateTotalPieces(path
, getPieceSize(), isAlignmentOptimized, getPaddedFileSizeLimit());
#endif
m_ui->labelTotalPieces->setText(QString::number(count));