Thread für Ermittlung von Dateigrößen
Verfasst: 2. Juli 2006 12:02
Hallo!
Ich soll in einem QThread von gegebenen Verzeichnissen deren Größen ermitteln. In bestimmten Zeit- oder Speichergrößenabständen (ich habs für alle 5 Mb implementiert) soll ein Signal emitted werden, welches über den Zwischenstand informiert. Der Thread muss abgebrochen werden können, und schlafen gelegt werden, wenn er fertig ist.
Meine Implementierung funktioniert soweit, allerdings würde ich gerne es noch verbessern:
1. Die Funktion stop() ist relativ unsauber programmiert (while (!sleeping)). stop() soll den Thread beenden und anschließend warten, bis der tatsächlich beendet ist. Kann man das sauberer machen?
2. Sollten irgendwo Mutexes eingesetzt werden?
Ich soll in einem QThread von gegebenen Verzeichnissen deren Größen ermitteln. In bestimmten Zeit- oder Speichergrößenabständen (ich habs für alle 5 Mb implementiert) soll ein Signal emitted werden, welches über den Zwischenstand informiert. Der Thread muss abgebrochen werden können, und schlafen gelegt werden, wenn er fertig ist.
Meine Implementierung funktioniert soweit, allerdings würde ich gerne es noch verbessern:
1. Die Funktion stop() ist relativ unsauber programmiert (while (!sleeping)). stop() soll den Thread beenden und anschließend warten, bis der tatsächlich beendet ist. Kann man das sauberer machen?
2. Sollten irgendwo Mutexes eingesetzt werden?
Code: Alles auswählen
DirSizeThread::DirSizeThread(void)
{
size = 0;
oldsize = 0;
sizedif = 5*1024*1024; //alle 5 Mb Signal senden
stopped = false;
sleeping = true;
}
void DirSizeThread::run()
{
sleeping=false;
for (int i=0; i<dir.size() && !stopped; i++){
oldsize = 0;
currentDir = dir.at(i);
size=0;
dirSize(QFileInfo(currentDir));
// Signal emitten, da Endgröße berechnet und anschließend currentdir wieder gelöscht wird
if (!stopped && !currentDir.endsWith("..") && !currentDir.endsWith(".")) emitNewDirSizeSignal();
}
sleeping=true;
stopped=false;
}
void DirSizeThread::dirSize(QFileInfo fileinfo){
if (!fileinfo.exists() || stopped || fileinfo.absoluteFilePath().endsWith("..") || fileinfo.absoluteFilePath().endsWith(".")) return;
if (fileinfo.isDir()){
QFileInfoList list = QDir(fileinfo.absoluteFilePath()).entryInfoList();
for (int i=0; i<list.size(); i++){
dirSize(list.at(i));
}
} else if (fileinfo.isFile()){
size+=fileinfo.size();
if (size-oldsize>=sizedif)
emitNewDirSizeSignal();
}
}
void DirSizeThread::stop(){
if(!sleeping) stopped = true;
//warten, bis Thread tatsächlich beendet ist
while(!sleeping){
printf("sleeping=false\n");
}
}
bool DirSizeThread::isSleeping(){
return sleeping;
}
void DirSizeThread::setDirectory(QList<QString> dir){
qSort(dir);
this->dir=dir;
}
void DirSizeThread::emitNewDirSizeSignal(){
oldsize=size;
emit newDirSize(currentDir, size/1024);
}