Laufwerke Parallel zum weiteren Programmablauf durchsuchen
-
Hallo, und zwar möchte ich während mein Programm läuft durch Klick auf einen Button sämtliche Festplatten nach Dateien mit einer bestimmten Endung durchsuchen.
Eine Funktion zum bestimmen der Festplatten & zum durchsuchen ist vorhanden. - Der Parallele Ablauf soll bestehen, damit während dessen weiter mit dem Programm gearbeitet werden kann, denn es läuft eine Schleife ab, die das Programm ja dann erstmal für Eingaben blockiert.
Das ich es mit Threads machen sollte ist mir klar. - Jedoch habe ich damit noch nie gearbeitet. - So sieht mein Versuch aktuell aus (TmyThread aus BCB-Tutorial).
In der Funktion Execute führe ich die Suchfunktion aus, welche in einem Form steht. - Soweit funktioniert das auch. Problematisch für mich ist, dass ich bei jedem neuen Ordner einen neuen Thread starte. - Klar, irgendwann meckert der Compiler weil kein Speicher mehr vorhanden ist.
Der Quellcode:
// Start des Threads void __fastcall TForm1::Aktualisieren1Click(TObject *Sender) { TStringList* fixed; fixed = Form5->findfixed(); // Festplatten ermitteln for(int i = 0; i<fixed->Count; i++) // Jede Festplatte durchgehen { AnsiString file = fixed->Strings[i]; Form5->findfiles(file); // Suchen in der aktuellen Festplatte } }
Bei der Funktion besteht das Problem, dass er dann direkt Parallel auf allen verfügbaren Platten sucht. - Es wäre mir jedoch lieber, wenn er jede einzeln durchsucht.
// Anstoß der Funktion zum durchsuchen der Ordner void TForm5::findfiles(AnsiString StartOrdner) { // Thread starten thread = new TMyThread(false, StartOrdner); thread->OnTerminate = DeleteThread; }
// Thread Execute void __fastcall TMyThread::Execute() { Form5->dosearch(StartOrdner); }
// Funktion zum Durchsuchen des Laufwerks (hier im Forum gefunden) void TForm5::dosearch(AnsiString StartOrdner) { HANDLE DateiHandle; WIN32_FIND_DATA DateiStruktur; AnsiString StartFo2 = ""; AnsiString StartFoFE = StartOrdner + "\\*"; //Startverzeichnis //Rekursive Suche Starten DateiHandle = FindFirstFile(StartFoFE.c_str(),&DateiStruktur); do { AnsiString Ordner_oder_Datei = DateiStruktur.cFileName; //Gefundener Ordner oder Datei //Ein Ordner wurde gefunden if (((DateiStruktur.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && DateiStruktur.cFileName!="$Windows") != 0 ) && Ordner_oder_Datei != ".." && Ordner_oder_Datei !=".") { StartFo2 = StartOrdner + "\\" + DateiStruktur.cFileName; Form5->findfiles(StartFo2); } //Eine Datei wurde gefunden if (((DateiStruktur.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0 ) && Ordner_oder_Datei != ".." && Ordner_oder_Datei != ".") { AnsiString file = DateiStruktur.cFileName; if(file.Pos(".mp3")>0) { Form5->ListView1->AddItem(StartOrdner+"\\"+file, NULL); zz++; Label1->Caption = zz; // Zähler für gefundene Dateien } } } while(FindNextFile(DateiHandle,&DateiStruktur)); FindClose(DateiHandle); thread->Terminate(); // Versuch hier den Thread zu beenden - Jedoch wegen der Fülle der Threads die gestartet werden unpassend }
Falls jemand Denkanstöße für mich hat, wie ich das ganze besser machen kann wäre ich offen für.
Also der Parallele Ablauf funktioniert. - Nur dafür wie ich es brauch zu gut.
-
Hallo
Dann solltest du eben die Schleife aus Aktualisieren1Click in dosearch verlegen. Statt einem AnsiString übergibst du eben einen Zeiger auf die TStringList fixed. Am betsen machst du davon innerhalb des Threads eine neue Kopie.
Der Effekt ist dann, das nicht für jedes Laufwerk sofort ein neuer Thread gestartet wird, sondern ein Thread nacheinander alle Laufwerke abarbeitet.bis bald
akari
-
Stimmt, sollte so funktionieren. - Ich bin jetzt aber noch einen Schritt weiter gegangen und hab alles relevanten Funktionen direkt in den Thread geschrieben.
So wird am Anfang auch nur dieser Thread gestartet. - Aber soweit hatte ich echt nicht gedacht. Gefunden wurden alle Dateien, die mit der Endung vorhanden waren. - Somit funktionieren die Funktionen auch richtig.
Die Schleife aus Aktualisieren1Click() Wird nun im Thread::Execute() ausgeführt. - Ich werd jetzt noch schaun ob der den Thread richtig beendet. - Ansonsten funktioniert nun alles einwandfrei.
Ich danke dir, der Denkanstoß war der Richtige.