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

Alles rund um die Programmierung mit Qt
Antworten
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

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

Beitrag 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
Zuletzt geändert von sigvdr am 6. September 2008 22:01, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Was macht QAudioTag bzw. wie ist der Backtrace etc.?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

Beitrag von sigvdr »

Hatte ich doch Recht mit den Tomaten !!!

Danke: Jetzt läufts!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn es das wirklich war dann hat es aber nichts mit der Klammerung zu tun :lol:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

So crasht es genauso wenn er nämlich aus der Schleife rausgeht (media.hasNext() == false) ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

QWaitCondition?
Antworten