Suchprozedur verfällt nach 6 Sekunden in "Keine Rückmeldung"
Verfasst: 26.03.2013 13:41
Hallo allerseits,
Ich bin dabei, ein Programm zu schreiben, mit dem ich unter anderem auf der Festplatte nach Dateien suchen kann.
Bisher kann mein Programm zwar noch nicht nach Zeichenketten suchen, aber in einem vorgegebenen Pfad alle enthaltenen Ordner und Dateien zählen und den Suchpfad, wenn er sich ändert, anzeigen.
Das Problem ist jetzt, dass das Programm, sofern der Ordner genug Dateien enthält, nach etwa 6 Sekunden in der Titelleiste ein "Keine Rückmeldung" ausgibt. Gleichzeitig ändert sich der Windows-7-Mauszeiger zu dem blauen-Beschäftigt-Kreissymbol, wenn ich mit der Maus über das Programmfenster gehe.
Die von mir gewünschten Augaben wie Ordner- oder Dateien-Anzahl und der Suchpfad werden in dieser Zeit nicht ausgegeben, und das Programm ist auch nicht bedienbar (Schließsymbol).
Es ist nicht immer dieselbe Datei, bei der dieser Zustand beginnt. Bei C:\ z.B. mal nach 49416, mal nach 50027 Dateien.
Das Programm arbeitet aber weiter, wie man an den Festplattengeräuschen hören kann. Und wenn das Zählen abgeschlossen ist, ist das Programm auch wieder ansprechbar, und die Werte werden ausgegeben.
Testhalber hatte ich in die Such-Prozedur ein Delay eingebaut, um zu sehen, was passiert. Die Such-Geschwindigkeit ändert sich zwar sofort spürbar, aber die Zeit, bis das "Keine Rückmeldung" erscheint, bleibt nahezu gleich.
Hier die für die Suche relevanten Prozeduren. Die Variablen sind alle global.
Vielleicht hat jemand von Euch eine Idee, warum dieses "Keine Rückmeldung", (das ich auch schon bei verschiedenen anderen Programmen erlebt habe) erscheint, und was man dagegegen tun kann.
Ich möchte unbedingt während des gesamten Suchvorgangs die vollständige Kontrolle über das Programm und den Suchvorgang behalten.
Danke!
Gruß
OlderCoder
Ich bin dabei, ein Programm zu schreiben, mit dem ich unter anderem auf der Festplatte nach Dateien suchen kann.
Bisher kann mein Programm zwar noch nicht nach Zeichenketten suchen, aber in einem vorgegebenen Pfad alle enthaltenen Ordner und Dateien zählen und den Suchpfad, wenn er sich ändert, anzeigen.
Das Problem ist jetzt, dass das Programm, sofern der Ordner genug Dateien enthält, nach etwa 6 Sekunden in der Titelleiste ein "Keine Rückmeldung" ausgibt. Gleichzeitig ändert sich der Windows-7-Mauszeiger zu dem blauen-Beschäftigt-Kreissymbol, wenn ich mit der Maus über das Programmfenster gehe.
Die von mir gewünschten Augaben wie Ordner- oder Dateien-Anzahl und der Suchpfad werden in dieser Zeit nicht ausgegeben, und das Programm ist auch nicht bedienbar (Schließsymbol).
Es ist nicht immer dieselbe Datei, bei der dieser Zustand beginnt. Bei C:\ z.B. mal nach 49416, mal nach 50027 Dateien.
Das Programm arbeitet aber weiter, wie man an den Festplattengeräuschen hören kann. Und wenn das Zählen abgeschlossen ist, ist das Programm auch wieder ansprechbar, und die Werte werden ausgegeben.
Testhalber hatte ich in die Such-Prozedur ein Delay eingebaut, um zu sehen, was passiert. Die Such-Geschwindigkeit ändert sich zwar sofort spürbar, aber die Zeit, bis das "Keine Rückmeldung" erscheint, bleibt nahezu gleich.
Hier die für die Suche relevanten Prozeduren. Die Variablen sind alle global.
Code: Alles auswählen
Procedure suchpfad()
suchpfad$="" ; Suchpfad zurücksetzen
For i=0 To ebene ; aktuellen Gesamt-Suchpfad zusammensetzen
If i>1 ; nur ab dem dritten Teil des Pfades
suchpfad$+"\" ; einen Backslash dazwischen
EndIf
suchpfad$+namen$(i) ; Suchpfad um neuen Ordnernamen ergänzen
Next i
EndProcedure
Procedure suchen()
ebene=0 ; Ordnerebene zunächst ganz nach oben stellen
anzfile=0 ; Anzahl der gefundenen Dateien auf 0
anzfolder=0 ; Anzahl der gefundenen Ordner auf 0
If ExamineDirectory(ebene, suchpfad$,"*") ; wenn der Ordner geöffnet werden konnte
namen$(0)=suchpfad$ ; 1. Teil des Suchpfades auf den Anfangssuchpfad setzen
SetGadgetText(16,suchpfad$) ; Anfags-Suchpfad ausgeben
; hier beginnt die eigentliche Suche
weitersuchen:
While NextDirectoryEntry(ebene) ; Wenn es einen weiteren Eintrag gibt
h$ = DirectoryEntryName(ebene) ; Name des Eintrags holen
; Delay(200) ; Testverzögerung, nur wegen wegen Bugsuche, wird wieder gelöscht!
If DirectoryEntryType(ebene)=#PB_DirectoryEntry_File ; wenn es eine Datei ist
anzfile+1 ; Anzahl der durchsuchten Dateien zählen und ausgeben
SetGadgetText(18,Str(anzfile))
; hier kommt später der Suchtest hin
ElseIf h$<>"." And h$<>".." ; wenn es ein Ordner ist aber nicht "." oder ".." (??)
anzfolder+1 ; Anzahl der durchsuchten Ordner zählen und ausgeben
SetGadgetText(20,Str(anzfolder))
; hier kommt später der Suchtest hin
ebene+1 ; Suche +1 in die Tiefe
namen$(ebene)=h$ ; neuen Eintragsnamen holen, in diesem Fall ein Ordner
suchpfad()
If ExamineDirectory(ebene,suchpfad$,"*") ; wenn dieser Ordner auch zu öffnen war
SetGadgetText(16,suchpfad$) ; neuen Pfad auch ausgeben
Else ; wenn nicht
ebene-1 ; Ebene wieder zurück
suchpfad()
EndIf
EndIf
Wend
; es gibt keinen Eintrag mehr im aktuellen Verzeichnis
FinishDirectory(ebene) ; aktuelles Verzeichnis wieder schließen
ebene-1 ; Ebene wieder 1 nach oben
If ebene >=0 ; das oberste Verzeichnis ist noch nicht fertig
suchpfad() ; verkürzten Suchpfad zusammensetzen
SetGadgetText(16,suchpfad$) ; und ausgeben
Goto weitersuchen ; weitersuchen, Goto+Sprungmarke später ersetzen!
EndIf
; Suche ist fertig
DisableGadget(2,0) ; Start-Taste einschalten
DisableGadget(3,1) ; Stop-Taste abschalten
Else ; keine Suche, wenn Anfangsverzeichnis nicht zu öffnen
MessageRequester("Fehler!","Das Verzeichnis konnte nicht geöffnet werden!")
EndIf
EndProcedure
Ich möchte unbedingt während des gesamten Suchvorgangs die vollständige Kontrolle über das Programm und den Suchvorgang behalten.
Danke!
Gruß
OlderCoder