Seite 1 von 1

Thread für Ermittlung von Dateigrößen

Verfasst: 2. Juli 2006 12:02
von Gayson
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?

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);
}