Announcement

Collapse
No announcement yet.

Platte im Hintergrund durchsuchen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Platte im Hintergrund durchsuchen

    Ich weiß nicht, ob ich mit meiner Frage in dieser Sektion überhaupt richtig bin. Es geht um folgendes:<p>
    Ich möchte, daß in meiner Anwendung "im Hintergrund" die Festplatte nach einer Datei durchsucht und das Ergebnis in einer Stringliste dargestellt wird. Das Problem ist der Ablauf "im Hintergrund". Wenn ich die Suchaktion als synchronisierten Thread starte, hat der Benutzer den Eindruck, die visuellen Elemente seien während des Suchvorgangs zeitweise gesperrt - das stimmt zwar nicht, aber die Resultate eines Klicks auf einen Button sieht er erst, nachdem der Suchvorgang abgeschlossen ist. <p>
    Fragen:<p>
    1. Ist es überhaupt möglich, auf einem 1-Prozessor-System parallel zum Durchsuchen einer Festplatte einen anderen Prozeß oder Thread ablaufen zu lassen, der nicht auf die Platte zugreift?<p>
    2. Wenn ja: eignet sich ein Thread dazu oder gibt es effektivere Wege?<p>
    Danke im voraus - Gerhard.

  • #2
    Hallo,

    was bedeutet "synchronisierter Thread" konkret (d.h. wie sieht der Aufruf im Programm aus), oder anders gefragt, warum wird der primäre Thread mit dem zweiten Such-Thread synchronisiert? Bei dieser Aufgabe reicht es doch aus, wenn der primäre Thread (das Hauptformular) über 2 Ereigniss-Kategorien informiert wird: <br>
    1. Es wurde eine Datei gefunden <br>
    2. Die Suche ist beendet. <br>
    Dabei können beide Informationen im asynchronen Betrieb übermittelt werden - der abgespaltete Thread erreicht den besten Wirkungsgrad.

    Die Frage, ob sich ein Thread eignet, beantwortet der <b>Suchen</b>-Dialog von Windows 9x. Auch wenn dort noch der Datenträger durchsucht wird, kann man bereits die in der Liste angezeigten Dateien aufrufen. Die Suche auf der Festplatte ist so langsam, das sich ein zweiter Thread in jedem Fall lohnt

    Comment


    • #3
      Hallo Herr Kosch,
      danke für die schnelle Reaktion.
      Die Situation ist folgende:
      Der Anwender hat sich für das Speichern seiner Datei entschieden, mit dem SaveDialog ein Verzeichnis ausgewählt und den Speichern-Button betätigt. Jetzt soll <p>
      1. seine Datei auf Platte gespeichert und der Dialog geschlossen werden<p>
      2. eine andere Datei auf der Platte gesucht und in das vom Anwender bestimmte Verzeichnis kopiert werden. Dies soll ohne Intervention des Anwender im Hintergrund ablaufen.<p>
      3. Parallel zum (u.U. lang andauernden) Suchvorgang soll der Anwender die Anwendung verzögerungsfrei bedienen können, z.B. einen Button anklicken.<p>
      Der Aufruf des Zweiten Threads (zum Suchen) ist simpel:<p>
      im primären Thread<p>
      procedure SaveAFile;
      begin
      {nach dem Speichern}
      ZT := TZweiterThread.Create(False);<p>
      end;
      und im sekundären Thread:<p>
      procedure TZweiterThread.Execute;<p>
      begin<p>
      Synchronize(Search);<p>
      end;<p>
      Den Suchcode in Search erspare ich mir hier (er wird mit der HyperStr-Funktion PathScan ausgeführt).<p>
      Weiter im Hauptformular z.B.:<p>
      procedure Button3Click;<p>
      begin<p>
      ShowMessage('aha');<p>
      end;<p>

      Das Problem ist: wird die Suchfunktion aufgerufen, ohne daß sie als Thread deklariert ist, ist das Formular für andere Ereignisse blockiert, Schaltflächen zeigen keine sichtbare Reaktion. Wird die Suchfunktion als Thread aufgerufen, ist der Effekt fast der gleiche: Erst wenn die Suchfunktion abgearbeitet ist, sieht der Anwender, ob bzw. daß er zwischendurch den Button3 angeklickt hat. Oder müssen Button3Click und alle anderen in dieser Situation möglichen Befehle auch synchronisiert werden??

      Comment


      • #4
        Hallo,

        der "Fehler" liegt darin, das über <b>Synchronize</b> die komplette Such-Methode aufgerufen wird. In diesem Fall sorgt Synchronize dafür, das immer nur <b>ein einziger Thread</b> zur gleichen Zeit ausgeführt wird (entspricht also dem Verhalten eines <b>Fibers</b> unter NT).

        Es muss als Pseudo-Code so aussehen, damit beide Threads parallel ablaufen können:
        <pre>
        procedure TZweiterThread.Execute;
        begin
        Suche initialisieren;
        Suche starten;
        while Datei gefunden do
        Synchronize(Suchergebnis);
        SucheNächsteDatei;
        end;
        Synchronize(Suche_ist_zu_Ende);
        end;
        </pre>
        In diesem Fall wird der primäre Thread über Sychronize nur dann angehalten, wenn <br>
        a) eine Datei gefunden wurde, oder<br>
        b) die Suche am Ende ist

        Comment

        Working...
        X