mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2025-01-12 18:24:58 +08:00
- Multithreaded deletionThread (harmonized with deleteThread)
This commit is contained in:
parent
5518144b26
commit
570296c29e
@ -66,6 +66,8 @@ bittorrent::bittorrent(){
|
||||
downloader = new downloadThread(this);
|
||||
connect(downloader, SIGNAL(downloadFinished(QString, QString)), this, SLOT(processDownloadedFile(QString, QString)));
|
||||
connect(downloader, SIGNAL(downloadFailure(QString, QString)), this, SLOT(HandleDownloadFailure(QString, QString)));
|
||||
// File deleter (thread)
|
||||
deleter = new deleteThread(this);
|
||||
}
|
||||
|
||||
// Main destructor
|
||||
@ -76,6 +78,7 @@ bittorrent::~bittorrent(){
|
||||
saveDHTEntry();
|
||||
saveFastResumeAndRatioData();
|
||||
// Delete our objects
|
||||
delete deleter;
|
||||
delete timerAlerts;
|
||||
delete ETARefresher;
|
||||
delete downloader;
|
||||
@ -184,17 +187,10 @@ void bittorrent::deleteTorrent(QString hash, bool permanent){
|
||||
// Remove from Hard drive
|
||||
qDebug("Removing this on hard drive: %s", qPrintable(savePath+QDir::separator()+fileName));
|
||||
// Deleting in a thread to avoid GUI freeze
|
||||
deleteThread *deleter = new deleteThread(savePath+QDir::separator()+fileName);
|
||||
connect(deleter, SIGNAL(deletionFinished(deleteThread*)), this, SLOT(cleanDeleter(deleteThread*)));
|
||||
deleter->deletePath(savePath+QDir::separator()+fileName);
|
||||
}
|
||||
}
|
||||
|
||||
// slot to destroy a deleteThread once it finished deletion
|
||||
void bittorrent::cleanDeleter(deleteThread* deleter){
|
||||
qDebug("Deleting deleteThread because it finished deletion");
|
||||
delete deleter;
|
||||
}
|
||||
|
||||
// Pause a running torrent
|
||||
bool bittorrent::pauseTorrent(QString hash){
|
||||
bool change = false;
|
||||
|
@ -55,6 +55,7 @@ class bittorrent : public QObject{
|
||||
QTimer *ETARefresher;
|
||||
QList<QString> fullAllocationModeList;
|
||||
QHash<QString, QList<QPair<QString, QString> > > trackersErrors;
|
||||
deleteThread *deleter;
|
||||
|
||||
protected:
|
||||
QString getSavePath(QString hash);
|
||||
@ -125,7 +126,6 @@ class bittorrent : public QObject{
|
||||
void setUploadLimit(QString hash, int val);
|
||||
|
||||
protected slots:
|
||||
void cleanDeleter(deleteThread* deleter);
|
||||
void scanDirectory();
|
||||
void readAlerts();
|
||||
void processDownloadedFile(QString, QString);
|
||||
|
@ -23,31 +23,121 @@
|
||||
#define DELETETHREAD_H
|
||||
|
||||
#include <QThread>
|
||||
#include <QMutex>
|
||||
#include <QWaitCondition>
|
||||
#include <QMutexLocker>
|
||||
|
||||
#include "misc.h"
|
||||
|
||||
class subDeleteThread : public QThread {
|
||||
Q_OBJECT
|
||||
private:
|
||||
QString path;
|
||||
bool abort;
|
||||
|
||||
public:
|
||||
subDeleteThread(QObject *parent, QString path) : QThread(parent), path(path){
|
||||
abort = false;
|
||||
}
|
||||
|
||||
~subDeleteThread(){
|
||||
abort = true;
|
||||
wait();
|
||||
}
|
||||
|
||||
signals:
|
||||
// For subthreads
|
||||
void deletionSuccessST(subDeleteThread* st, QString path);
|
||||
void deletionFailureST(subDeleteThread* st, QString path);
|
||||
|
||||
protected:
|
||||
void run(){
|
||||
if(misc::removePath(path))
|
||||
emit deletionSuccessST(this, path);
|
||||
else
|
||||
emit deletionFailureST(this, path);
|
||||
qDebug("deletion completed for %s", (const char*)path.toUtf8());
|
||||
}
|
||||
};
|
||||
|
||||
class deleteThread : public QThread {
|
||||
Q_OBJECT
|
||||
|
||||
private:
|
||||
QString path;
|
||||
QStringList path_list;
|
||||
QMutex mutex;
|
||||
QWaitCondition condition;
|
||||
bool abort;
|
||||
QList<subDeleteThread*> subThreads;
|
||||
|
||||
public :
|
||||
deleteThread(QString _path): path(_path){
|
||||
start();
|
||||
signals:
|
||||
void deletionSuccess(QString path);
|
||||
void deletionFailure(QString path);
|
||||
|
||||
public:
|
||||
deleteThread(QObject* parent) : QThread(parent){
|
||||
abort = false;
|
||||
}
|
||||
|
||||
~deleteThread(){
|
||||
mutex.lock();
|
||||
abort = true;
|
||||
condition.wakeOne();
|
||||
mutex.unlock();
|
||||
subDeleteThread *st;
|
||||
foreach(st, subThreads){
|
||||
delete st;
|
||||
}
|
||||
wait();
|
||||
}
|
||||
|
||||
signals:
|
||||
void deletionFinished(deleteThread*) const;
|
||||
void deletePath(QString path){
|
||||
QMutexLocker locker(&mutex);
|
||||
path_list << path;
|
||||
if(!isRunning()){
|
||||
start();
|
||||
}else{
|
||||
condition.wakeOne();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
protected:
|
||||
void run(){
|
||||
misc::removePath(path);
|
||||
emit deletionFinished(this);
|
||||
forever{
|
||||
if(abort)
|
||||
return;
|
||||
mutex.lock();
|
||||
if(path_list.size() != 0){
|
||||
QString path = path_list.takeFirst();
|
||||
mutex.unlock();
|
||||
subDeleteThread *st = new subDeleteThread(0, path);
|
||||
subThreads << st;
|
||||
connect(st, SIGNAL(deletionSuccessST(subDownloadThread*, QString, QString)), this, SLOT(propagateDeletionSuccess(subDeleteThread*, QString)));
|
||||
connect(st, SIGNAL(deletionFailureST(subDownloadThread*, QString, QString)), this, SLOT(propagateDeletionFailure(subDeleteThread*, QString)));
|
||||
st->start();
|
||||
}else{
|
||||
condition.wait(&mutex);
|
||||
mutex.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
protected slots:
|
||||
void propagateDeletionSuccess(subDeleteThread* st, QString path){
|
||||
int index = subThreads.indexOf(st);
|
||||
Q_ASSERT(index != -1);
|
||||
subThreads.removeAt(index);
|
||||
delete st;
|
||||
emit deletionSuccess(path);
|
||||
qDebug("%s was successfully deleted", (const char*)path.toUtf8());
|
||||
}
|
||||
|
||||
void propagateDeletionFailure(subDeleteThread* st, QString path){
|
||||
int index = subThreads.indexOf(st);
|
||||
Q_ASSERT(index != -1);
|
||||
subThreads.removeAt(index);
|
||||
delete st;
|
||||
emit deletionFailure(path);
|
||||
std::cerr << "Could not delete path: " << (const char*)path.toUtf8() << ". Check if qBittorrent has the required rights.\n";
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -194,20 +194,16 @@ class downloadThread : public QThread {
|
||||
protected slots:
|
||||
void propagateDownloadedFile(subDownloadThread* st, QString url, QString path){
|
||||
int index = subThreads.indexOf(st);
|
||||
if(index == -1)
|
||||
std::cerr << "ERROR: Couldn't delete download subThread!\n";
|
||||
else
|
||||
subThreads.takeAt(index);
|
||||
Q_ASSERT(index != -1);
|
||||
subThreads.removeAt(index);
|
||||
delete st;
|
||||
emit downloadFinished(url, path);
|
||||
}
|
||||
|
||||
void propagateDownloadFailure(subDownloadThread* st, QString url, QString reason){
|
||||
int index = subThreads.indexOf(st);
|
||||
if(index == -1)
|
||||
std::cerr << "ERROR: Couldn't delete download subThread!\n";
|
||||
else
|
||||
subThreads.takeAt(index);
|
||||
Q_ASSERT(index != -1);
|
||||
subThreads.removeAt(index);
|
||||
delete st;
|
||||
emit downloadFailure(url, reason);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user