Seite 1 von 1

[gelöst] QThread::run Programm stürzt ab wenn ...

Verfasst: 6. September 2008 18:54
von sigvdr
In einer Klasse von QThread abgeleitet, suche ich nach Dateien in größeren Qrdnern. Die gefundenen Dateien werden dann per Signal - Slot Verbindung im Programm weiterverarbeitet. Dazu gibt es innerhalb von QThread::run diesen Code der auch so funktioniert.

Code: Alles auswählen

class ScanForFiles : public QThread {
...
...

void ScanForFiles::run(void) {
	int n = 0;
	QDirIterator media(directory , filters, QDir::AllEntries | QDir::AllDirs, QDirIterator::Subdirectories);
	while ( ( ! terminateFlag ) & ( media.hasNext() ) ) {
		busyFlag = true;
		media.next();
		if ( media.fileInfo().isDir() )  {
			QString path(media.fileInfo().path());
			emit addDir( &path );
			continue;
		} //else { 
			emit status(n);
			if (n++ > 100) n=0;
			QAudioTag tag(media.fileInfo().filePath()); 
			emit addFile(&tag);			
		//} 
		while ( busyFlag ) {
			msleep(1);
		}
	}	
}
warum stürzt das Programm aber ab, sobald ich in den 2 Zeilen die Kommentarzeichen // lösche ? ( "// else {" und "//}" ) .
Habe ich schon den ganzen Tag die Tomaten auf den Augen, so dass ich den Fehler nicht sehen kann??
Eigentlich bin ich der Meinung, dass beides funktionieren müsste!

Gruß Sig

Verfasst: 6. September 2008 19:21
von Christian81
Was macht QAudioTag bzw. wie ist der Backtrace etc.?

Verfasst: 6. September 2008 20:16
von sigvdr
QAudioTag holt sich in tausendfach bewährter Weise die ID3 Tags aus Audiodateien.
Backtrace ??? Die weitere Verarbeitung von addDir und addFile ?
Der Slot hinter addDir macht noch fast nichts. Setzt nuir dieses busyFlag wieder zurück.
addFile trägt die Infos der Tags in eine Tabelle ein.
Bisher sah der Programmteil so aus:

Code: Alles auswählen

 
     if ( media.fileInfo().isDir() )  {
         continue;
      } 
      emit status(n);
      if (n++ > 100) n=0;
      QAudioTag tag(media.fileInfo().filePath());
      emit addFile(&tag);         
      
und den wollte ich um das Signal "addDir" erweitern.

Aber auch schon das hier:

Code: Alles auswählen

 
     if ( media.fileInfo().isDir() )  {
         continue;
      } else {
         emit status(n);
         if (n++ > 100) n=0;
         QAudioTag tag(media.fileInfo().filePath());
         emit addFile(&tag);         
      }
geht schon nicht mehr. Was ist falsch an dem zusätzlichen "else {}"

Ich könnte ja prinzipiell mit der Version von oben Leben aber mich nervt, dass ich nicht dahinterkomme warum das Probleme macht .

Gruß Sig

Verfasst: 6. September 2008 20:56
von upsala

Verfasst: 6. September 2008 21:06
von Christian81

Code: Alles auswählen

   {
   ...
   QAudioTag tag(media.fileInfo().filePath());
   emit addFile(&tag);         
   }
Ich würde sagen wir fangen nochmal bei den C-Grundlagen (vor allem Gültigkeit von Variablen) an... habe ich vorhin gar nicht so gesehen.

Verfasst: 6. September 2008 21:43
von sigvdr
Hatte ich doch Recht mit den Tomaten !!!

Danke: Jetzt läufts!

Verfasst: 6. September 2008 22:03
von Christian81
Wenn es das wirklich war dann hat es aber nichts mit der Klammerung zu tun :lol:

Verfasst: 8. September 2008 12:45
von sigvdr
Das kommt nur von der Klammerung:
QAudioTag tag... ist ja so nur innerhalb der Klammer gültig und nicht mehr während der Warteschleife.

Code: Alles auswählen

    } else {
         emit status(n);
         if (n++ > 100) n=0;
         QAudioTag tag(media.fileInfo().filePath());
         emit addFile(&tag);         
      }
// ab hier ist QAudioTag tag.. nicht mehr definiert
// Der Slot, der das Signal von addFile verarbeitet, erhält einen Zeiger
// auf eine bereits gelöschte Klasse 
      while ( busyFlag ) {
         msleep(1);
      }

Also die Definition : QAudioTag tag nach vorne schieben

Code: Alles auswählen

void ScanForFiles::run(void) {
   int n = 0;
   QDirIterator media(directory , filters, QDir::AllEntries | QDir::AllDirs, QDirIterator::Subdirectories);
   while ( ( ! terminateFlag ) & ( media.hasNext() ) ) {
      busyFlag = true;
      media.next();
      QAudioTag tag;
      if ( media.fileInfo().isDir() )  {
         QString path(media.fileInfo().path());
         emit addDir( &path );
         continue;
      } //else {
         emit status(n);
         if (n++ > 100) n=0;
         tag.setFileName(media.fileInfo().filePath());
         emit addFile(&tag);         
      //}
      while ( busyFlag ) {
         msleep(1);
      }
   }   
}
Gruß Sig

Verfasst: 8. September 2008 13:34
von Christian81
So crasht es genauso wenn er nämlich aus der Schleife rausgeht (media.hasNext() == false) ...

Verfasst: 8. September 2008 14:14
von sigvdr
Wenn die Schleife verlassen wird, interessiert mich die Klasse tag auch nicht mehr. Durch

Code: Alles auswählen

      while ( busyFlag ) {
         msleep(1);
      }
bleibt sie genau so lange erhalten wie ich sie benötige.

Wobei mir dieses Konzept mit dem busyFlag nicht wirklich gefällt, aber mir ist noch nichts besseres eingefallen.

Gibt es dazu bessere Ansätze ?

Gruß Sig

Verfasst: 8. September 2008 21:08
von upsala
QWaitCondition?