mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-01-14 16:57:55 +00: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);
|
downloader = new downloadThread(this);
|
||||||
connect(downloader, SIGNAL(downloadFinished(QString, QString)), this, SLOT(processDownloadedFile(QString, QString)));
|
connect(downloader, SIGNAL(downloadFinished(QString, QString)), this, SLOT(processDownloadedFile(QString, QString)));
|
||||||
connect(downloader, SIGNAL(downloadFailure(QString, QString)), this, SLOT(HandleDownloadFailure(QString, QString)));
|
connect(downloader, SIGNAL(downloadFailure(QString, QString)), this, SLOT(HandleDownloadFailure(QString, QString)));
|
||||||
|
// File deleter (thread)
|
||||||
|
deleter = new deleteThread(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main destructor
|
// Main destructor
|
||||||
@ -76,6 +78,7 @@ bittorrent::~bittorrent(){
|
|||||||
saveDHTEntry();
|
saveDHTEntry();
|
||||||
saveFastResumeAndRatioData();
|
saveFastResumeAndRatioData();
|
||||||
// Delete our objects
|
// Delete our objects
|
||||||
|
delete deleter;
|
||||||
delete timerAlerts;
|
delete timerAlerts;
|
||||||
delete ETARefresher;
|
delete ETARefresher;
|
||||||
delete downloader;
|
delete downloader;
|
||||||
@ -184,17 +187,10 @@ void bittorrent::deleteTorrent(QString hash, bool permanent){
|
|||||||
// Remove from Hard drive
|
// Remove from Hard drive
|
||||||
qDebug("Removing this on hard drive: %s", qPrintable(savePath+QDir::separator()+fileName));
|
qDebug("Removing this on hard drive: %s", qPrintable(savePath+QDir::separator()+fileName));
|
||||||
// Deleting in a thread to avoid GUI freeze
|
// Deleting in a thread to avoid GUI freeze
|
||||||
deleteThread *deleter = new deleteThread(savePath+QDir::separator()+fileName);
|
deleter->deletePath(savePath+QDir::separator()+fileName);
|
||||||
connect(deleter, SIGNAL(deletionFinished(deleteThread*)), this, SLOT(cleanDeleter(deleteThread*)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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
|
// Pause a running torrent
|
||||||
bool bittorrent::pauseTorrent(QString hash){
|
bool bittorrent::pauseTorrent(QString hash){
|
||||||
bool change = false;
|
bool change = false;
|
||||||
|
@ -55,6 +55,7 @@ class bittorrent : public QObject{
|
|||||||
QTimer *ETARefresher;
|
QTimer *ETARefresher;
|
||||||
QList<QString> fullAllocationModeList;
|
QList<QString> fullAllocationModeList;
|
||||||
QHash<QString, QList<QPair<QString, QString> > > trackersErrors;
|
QHash<QString, QList<QPair<QString, QString> > > trackersErrors;
|
||||||
|
deleteThread *deleter;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QString getSavePath(QString hash);
|
QString getSavePath(QString hash);
|
||||||
@ -125,7 +126,6 @@ class bittorrent : public QObject{
|
|||||||
void setUploadLimit(QString hash, int val);
|
void setUploadLimit(QString hash, int val);
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
void cleanDeleter(deleteThread* deleter);
|
|
||||||
void scanDirectory();
|
void scanDirectory();
|
||||||
void readAlerts();
|
void readAlerts();
|
||||||
void processDownloadedFile(QString, QString);
|
void processDownloadedFile(QString, QString);
|
||||||
|
@ -23,31 +23,121 @@
|
|||||||
#define DELETETHREAD_H
|
#define DELETETHREAD_H
|
||||||
|
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
#include <QMutex>
|
||||||
|
#include <QWaitCondition>
|
||||||
|
#include <QMutexLocker>
|
||||||
|
|
||||||
#include "misc.h"
|
#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 {
|
class deleteThread : public QThread {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString path;
|
QStringList path_list;
|
||||||
|
QMutex mutex;
|
||||||
|
QWaitCondition condition;
|
||||||
|
bool abort;
|
||||||
|
QList<subDeleteThread*> subThreads;
|
||||||
|
|
||||||
public :
|
signals:
|
||||||
deleteThread(QString _path): path(_path){
|
void deletionSuccess(QString path);
|
||||||
start();
|
void deletionFailure(QString path);
|
||||||
|
|
||||||
|
public:
|
||||||
|
deleteThread(QObject* parent) : QThread(parent){
|
||||||
|
abort = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
~deleteThread(){
|
~deleteThread(){
|
||||||
|
mutex.lock();
|
||||||
|
abort = true;
|
||||||
|
condition.wakeOne();
|
||||||
|
mutex.unlock();
|
||||||
|
subDeleteThread *st;
|
||||||
|
foreach(st, subThreads){
|
||||||
|
delete st;
|
||||||
|
}
|
||||||
wait();
|
wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
signals:
|
void deletePath(QString path){
|
||||||
void deletionFinished(deleteThread*) const;
|
QMutexLocker locker(&mutex);
|
||||||
|
path_list << path;
|
||||||
|
if(!isRunning()){
|
||||||
|
start();
|
||||||
|
}else{
|
||||||
|
condition.wakeOne();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
void run(){
|
void run(){
|
||||||
misc::removePath(path);
|
forever{
|
||||||
emit deletionFinished(this);
|
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:
|
protected slots:
|
||||||
void propagateDownloadedFile(subDownloadThread* st, QString url, QString path){
|
void propagateDownloadedFile(subDownloadThread* st, QString url, QString path){
|
||||||
int index = subThreads.indexOf(st);
|
int index = subThreads.indexOf(st);
|
||||||
if(index == -1)
|
Q_ASSERT(index != -1);
|
||||||
std::cerr << "ERROR: Couldn't delete download subThread!\n";
|
subThreads.removeAt(index);
|
||||||
else
|
|
||||||
subThreads.takeAt(index);
|
|
||||||
delete st;
|
delete st;
|
||||||
emit downloadFinished(url, path);
|
emit downloadFinished(url, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
void propagateDownloadFailure(subDownloadThread* st, QString url, QString reason){
|
void propagateDownloadFailure(subDownloadThread* st, QString url, QString reason){
|
||||||
int index = subThreads.indexOf(st);
|
int index = subThreads.indexOf(st);
|
||||||
if(index == -1)
|
Q_ASSERT(index != -1);
|
||||||
std::cerr << "ERROR: Couldn't delete download subThread!\n";
|
subThreads.removeAt(index);
|
||||||
else
|
|
||||||
subThreads.takeAt(index);
|
|
||||||
delete st;
|
delete st;
|
||||||
emit downloadFailure(url, reason);
|
emit downloadFailure(url, reason);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user