Problème avec QThread
Fermé
Mourad2009B
Messages postés
114
Date d'inscription
lundi 23 août 2010
Statut
Membre
Dernière intervention
19 janvier 2023
-
1 sept. 2015 à 15:07
Bonjour à tous,
J'ai un problème auquel je ne trouve pas de solution. Et je viens vous demander votre aide.
Je développe en c++ et le framwork Qt, sous windows 8.1 quoi que le système d'exploitation n'a pas d'importance.
J'ai une focnction qui me permet de copier un répertoire avec tous ses sous répertoires et fichiers dans un répertoire qui porte le même nom mais qui se trouve dans un emplacement déférents.
Et voici cette fonction
Mais comme elle est bloquante avec les gros fichiers. C'est-à-dire qu'elle ne donne pas la main au système d'exploitation, pendant, la durée de copie. J'ai pensé à utiliser les thread
J'ai créé une nouvelle classe qui hérite de QThread
La voici
fichier .h
Et voici le .cpp
J'ai utilisé plusieures méthodes, la premiere c'est que run est appelée recursivement, mais ca ne marche pas vu que je ne peux pas lui envoyer les nouveaux repertoires
Et quand j'appelle xCopy à l'intérieur de run, elle redevient bloquante comme au début,
Pour lancer tous ça
Donc c'est quelqu'un à une idée,
Merci d'avance à vous tous
J'ai un problème auquel je ne trouve pas de solution. Et je viens vous demander votre aide.
Je développe en c++ et le framwork Qt, sous windows 8.1 quoi que le système d'exploitation n'a pas d'importance.
J'ai une focnction qui me permet de copier un répertoire avec tous ses sous répertoires et fichiers dans un répertoire qui porte le même nom mais qui se trouve dans un emplacement déférents.
Et voici cette fonction
xCopy(QString sourceFolder, QString destFolder)
{
//On crée le repertoire de déstination
QDir destDir(destFolder);
//On vérifie si le repertoire de déstination existe
if(!destDir.exists())
{
//Si il n'existe pas on le crée
destDir.mkdir(destFolder);
}
//On crée le repertoire source
QDir sourceDir(sourceFolder);
//On vérifie si le repertoire source existe, si il n'existe pas c'est que c'est un fichier et non un repertoire
if(!sourceDir.exists())
{
//On crée le fichier source
QFile sourceFile(sourceFolder);
//On vérifie si le fichier source existe, Si il n'existe pas on arrête tout
if(!sourceFile.exists())
{
return;
}
//Si le fichier source existe on continue
else
{
//On cree un fileinfo pour recuperer les informations sur le fichier
QFileInfo fi(sourceFolder);
//On recupere le nom de fichier
QString nameFile = fi.fileName();
//On vérifie si le fichier de destination existe et si c'est le cas on le supprime avant d'enregistrer le nouveau, sachant que le nom de fichier de déstination et le même que le fichier source
QFile destFile(destFolder+"/"+ nameFile);
if(destFile.exists())
destFile.remove();
//On enregistre le nouveau
QFile::copy(sourceFolder, destFolder+"/"+ nameFile);
sizeDirAfterCopy += fi.size();
if(sizeDirAfterCopy%(int)(tailleRepertoire/100) == 0)
{
i++;
emit valueChanged(i);
}
return;
}
}
//On vérifie si le repertoire source existe, si le repertoire source existe
else
{
//On recupère tous ses fichiers
QStringList files = sourceDir.entryList(QDir::Files);
int value = files.count()-1;
//On parcourt la liste des fichiers du repertoire source
for(int i = 0; i< files.count(); i++)
{
QString srcName = sourceFolder + "/" + files[i];
QString destName = destFolder + "/" + files[i];
QFile fichier_dest(destName);
//On vérifie si le fichier de destination existe et si c'est le cas on le supprime avant d'enregistrer le nouveau
if(fichier_dest.exists())
QFile::remove(destName);
//Si tout va bien on enregistre le fichier
QFile::copy(srcName, destName);
if(sizeDirAfterCopy%(int)(tailleRepertoire/100) == 0)
{
i++;
emit valueChanged(i);
}
}
files.clear();
files = sourceDir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
for(int i = 0; i< files.count(); i++)
{
QString srcName = sourceFolder + "/" + files[i];
QString destName = destFolder + "/" + files[i];
this->xCopy(srcName, destName);
}
}
Mais comme elle est bloquante avec les gros fichiers. C'est-à-dire qu'elle ne donne pas la main au système d'exploitation, pendant, la durée de copie. J'ai pensé à utiliser les thread
J'ai créé une nouvelle classe qui hérite de QThread
La voici
fichier .h
#ifndef MYTHREAD2_H
#define MYTHREAD2_H
#include <QObject>
#include <QObject>
#include <QThread>
#include <QMessageBox>
#include <QDir>
#include <stdio.h>
#include<string.h>
#include <fstream>
#include <sstream>
#include <QTextEdit>
class MyThread2 : public QThread
{
Q_OBJECT
public:
MyThread2(QTextEdit *textEdit);
~MyThread2();
public slots :
void run();
//Cette fonction sert a copier recurssivement tous les répertoires et fichiers
void xCopy(QString sourceFolder, QString destFolder);
//Cette fonction sert a copier recurssivement tous les répertoires et fichiers
void getDirSize(QString sourceFolder);
void setValues(QString sourceFolder, QString destFolder);
qlonglong sizeOfdir(QString path);
signals :
void valueChanged(int i);
void complete();
public :
int i;
qlonglong tailleRepertoire, sizeDirAfterCopy;
QString sourceFolder, destFolder, sourceFolderTmp, destFolderTmp;
QTextEdit *textEdit;
QStringList filesList, dirList;
bool temoin_fin_dir_list;
};
#endif // MYTHREAD2_H
Et voici le .cpp
#include "mythread2.h"
MyThread2::MyThread2(QTextEdit *textEdit)
{
}
MyThread2::~MyThread2()
{
}
//Sert a assigner les repertoires source et destnation
void MyThread2::setValues(QString sourceFolder, QString destFolder)
{
this->destFolder = destFolder;
this->sourceFolder = sourceFolder;
sourceFolderTmp = destFolder;
destFolderTmp = destFolder;
}
void MyThread2::run()
{
QDir destDir(destFolder);
if(!destDir.exists())
{
destDir.mkdir(destFolder);
}
QDir sourceDir(sourceFolder);
if(!sourceDir.exists())
{
QFile sourceFile(sourceFolder);
if(!sourceFile.exists())
{
return;
}
else
{
QFileInfo fileInfo(sourceFolder);
QString nameFile = fileInfo.fileName();
//On vérifie si le fichier de destination existe et si c'est le cas on le supprime avant d'enregistrer le nouveau
QFile destFile(destFolder+"/"+ nameFile);
if(destFile.exists())
destFile.remove();
//On enregistre le nouveau
QFile::copy(sourceFolder, destFolder+"/"+ nameFile);
return;
}
}
QStringList filesList = sourceDir.entryList(QDir::Files);
int value = filesList.count()-1;
for(int i = 0; i< filesList.count(); i++)
{
QString srcName = sourceFolder + "/" + filesList[i];
QString destName = destFolder + "/" + filesList[i];
//ui->textEditRaports->append(tr("Copie de") + "<br />" + srcName + "</b>" + "<br />" + tr("vers") + "<br />" + destName);
QFile fichier_dest(destName);
if(fichier_dest.exists())
QFile::remove(destName);
QFile::copy(srcName, destName);
sizeDirAfterCopy += fi.size();
if(sizeDirAfterCopy%(int)(tailleRepertoire/100) == 0)
{
i++;
emit valueChanged(i);
}
}
//files.clear();
QStringList dirList = sourceDir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
for(int i = 0; i< dirList.count(); i++)
{
textEdit->append(dirList.at(i));
QString srcName = sourceFolder + "/" + dirList[i];
QString destName = destFolder + "/" + dirList[i];
textEdit->append("//////////////////////////////////");
textEdit->append("srcName = " + srcName);
textEdit->append("destName = " + destName);
textEdit->append("sourceFolder = " + sourceFolder);
textEdit->append("destFolder = " + destFolder);
xCopy(srcName, destName);
//run();
}
emit complete();
}
void MyThread2::getDirSize(QString sourceFolder)
{
//QMessageBox::information(0, "sourceFolder", sourceFolder);
//On crée le repertoire source
QDir sourceDir(sourceFolder);
//On vérifie si le repertoire source existe, si il n'existe pas c'est que c'est un fichier et non un repertoire
if(!sourceDir.exists())
{
//QMessageBox::information(0, "pas repertoire", sourceDir.absolutePath());
//On crée le fichier source
QFile sourceFile(sourceFolder);
//On vérifie si le fichier source existe, Si il n'existe pas on arrête tout
if(!sourceFile.exists())
{
return;
}
//Si le fichier source existe on continue
else
{
//On cree un fileinfo pour recuperer les informations sur le fichier
QFileInfo fi(sourceFolder);
//On recupere le la aille du fichier qu'on ajoute à la somme totale de notre repertoire
tailleRepertoire += fi.size();
return;
}
}
//Si le repertoire source existe
else
{
//On recupère tous ses fichiers
QStringList files = sourceDir.entryList(QDir::Files);
//int value = files.count()-1;
//On parcourt la liste des fichiers du repertoire source
for(int i = 0; i< files.count(); i++)
{
QString srcName = sourceFolder + "/" + files[i];
QFile fichier_source(srcName);
tailleRepertoire += fichier_source.size();
}
files.clear();
files = sourceDir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
for(int i = 0; i< files.count(); i++)
{
QString srcName = sourceFolder + "/" + files[i];
this->getDirSize(srcName);
}
}
}
//Cette fonction sert a copier recurssivement tous les répertoires et fichiers
void MyThread2::xCopy(QString sourceFolder, QString destFolder)
{
//On crée le repertoire de déstination
QDir destDir(destFolder);
//On vérifie si le repertoire de déstination existe
if(!destDir.exists())
{
//Si il n'existe pas on le crée
destDir.mkdir(destFolder);
}
//On crée le repertoire source
QDir sourceDir(sourceFolder);
//On vérifie si le repertoire source existe, si il n'existe pas c'est que c'est un fichier et non un repertoire
if(!sourceDir.exists())
{
//On crée le fichier source
QFile sourceFile(sourceFolder);
//On vérifie si le fichier source existe, Si il n'existe pas on arrête tout
if(!sourceFile.exists())
{
return;
}
//Si le fichier source existe on continue
else
{
//On cree un fileinfo pour recuperer les informations sur le fichier
QFileInfo fi(sourceFolder);
//On recupere le nom de fichier
QString nameFile = fi.fileName();
//On vérifie si le fichier de destination existe et si c'est le cas on le supprime avant d'enregistrer le nouveau, sachant que le nom de fichier de déstination et le même que le fichier source
QFile destFile(destFolder+"/"+ nameFile);
if(destFile.exists())
destFile.remove();
//On enregistre le nouveau
QFile::copy(sourceFolder, destFolder+"/"+ nameFile);
sizeDirAfterCopy += fi.size();
if(sizeDirAfterCopy%(int)(tailleRepertoire/100) == 0)
{
i++;
emit valueChanged(i);
}
return;
}
}
//On vérifie si le repertoire source existe, si le repertoire source existe
else
{
//On recupère tous ses fichiers
QStringList files = sourceDir.entryList(QDir::Files);
int value = files.count()-1;
//On parcourt la liste des fichiers du repertoire source
for(int i = 0; i< files.count(); i++)
{
QString srcName = sourceFolder + "/" + files[i];
QString destName = destFolder + "/" + files[i];
QFile fichier_dest(destName);
//On vérifie si le fichier de destination existe et si c'est le cas on le supprime avant d'enregistrer le nouveau
if(fichier_dest.exists())
QFile::remove(destName);
//Si tout va bien on enregistre le fichier
QFile::copy(srcName, destName);
if(sizeDirAfterCopy%(int)(tailleRepertoire/100) == 0)
{
i++;
emit valueChanged(i);
}
}
files.clear();
files = sourceDir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
for(int i = 0; i< files.count(); i++)
{
QString srcName = sourceFolder + "/" + files[i];
QString destName = destFolder + "/" + files[i];
this->xCopy(srcName, destName);
}
}
}
J'ai utilisé plusieures méthodes, la premiere c'est que run est appelée recursivement, mais ca ne marche pas vu que je ne peux pas lui envoyer les nouveaux repertoires
files.clear();
files = sourceDir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
for(int i = 0; i< files.count(); i++)
{
QString srcName = sourceFolder + "/" + files[i];
QString destName = destFolder + "/" + files[i];
Run() ;
}
Et quand j'appelle xCopy à l'intérieur de run, elle redevient bloquante comme au début,
void MyThread2::xCopy(QString sourceFolder, QString destFolder)
{
xCopy(sourceFolder,destFolder);
}
Pour lancer tous ça
thread = new MyThread2(ui->textEdit);
thread->setValues("C:\\Users\\Mourad\\Desktop\\Nouveau dossier", "C:\\Users\\Mourad\\Desktop\\Nouveau dossier2");
connect(ui->bouton, SIGNAL(clicked()), thread, SLOT(start()));
connect(thread, SIGNAL(complete()), this, SLOT(calculTermine()));
Donc c'est quelqu'un à une idée,
Merci d'avance à vous tous
A voir également:
- Problème avec QThread
- Utiliser QThread. - Forum Programmation