2010-12-10 15 views
2

Ich habe eine Frage zu Threads und Kontrollen. Ich habe einen synchronen modalen Dialog erstellt. Es gibt drei Fortschrittsbalken und einige Beschriftungen. Wenn die Anwendung zum ersten Mal geöffnet wird, wird der Synchronisierungsdialog geöffnet und die Aktualisierung durchgeführt. Im Dialog Show() Methode erstelle ich drei verschiedene Threads. Jeder Thread steuert den Datendownload, das XML-Parsing und das Einfügen von Datenbanken. Und dann zeigt Fortschritt auf Fortschrittsbalken. Alles beschrieben, funktioniert gut.Schließen Fenster auf Fadenstopp

Nun das Problem - ich möchte diesen Dialog automatisch schließen, wenn alle Elemente heruntergeladen, analysiert und in die Datenbank eingefügt werden. Ich habe versucht zu überprüfen, ob progressbar.position gleich progressbar.max ist und ich habe versucht zu überprüfen, ob Threads beendet sind. Wenn ich mit dem Fortschrittsbalken gehe, schließt der Dialog zu früh und eine Fortschrittsleiste wird nicht vollständig beendet. Wenn ich mit der Thread-Überprüfung gehe, dann stoppen Fortschrittsbalken in der Mitte des Prozesses und das ist alles.

Vielleicht haben Sie es getan und erzählen Sie dem Delphi n00b, wie ist der beste Weg, es zu tun.

Vielen Dank im Voraus ...

Antwort

5

Für diese einfache Sache, können Sie das Faden OnTerminate Ereignis verwenden (die im Rahmen des Haupt-Thread ausgeführt wird) nur einen „Fadenzahl“ Variable auf 3 bei Thread initialisiert dekrementieren Schöpfungsmoment.

Wenn die Anzahl der Threads 0 erreicht, können Sie das Formular sicher schließen.

begin 
    //..thread creation, stuff 
    FThreadCount := 3; 
    DownloadThread.OnTerminate := DecThreadCount; 
    ParseThread.OnTerminate := DecThreadCount; 
    InsertThread.OnTerminate := DecThreadCount; 
    //resume threads and other stuff 
end; 

procedure TForm1.DecThreadCount(Sender: TObject); 
begin 
    Dec(FThreadCount); 
    if FThreadCount = 0 then 
    Close; 
end; 
+1

+1 Dies ist viel einfacher als meine Antwort "posten Sie eine Nachricht"! –

+0

Ich werde das versuchen, ist dieser ThreadDecCount irgendeine Art von Ereignis? – evilone

+0

@Evilone: ​​Es ist ein TNotifyEvent. – jachguate

1

ich Threads eine Nachricht bekommen würde wieder in den Dialog zu schreiben, wenn sie abgeschlossen ist. Sobald alle drei Nachrichten empfangen wurden, können Sie den Dialog schließen.

+0

ich bin neu in Delphi. Wie posten Sie diese Nachrichten? Nachmeldung/Sendemeldung? Kannst du mir ein Beispiel zeigen? – evilone

+0

@evilone In diesem Fall können Sie entweder anrufen. Um etwas über grundlegende Win32 zu lernen, sollten Sie Petzolds Buch lesen. –

2

Verwenden Sie Windows Vista oder Windows 7? Microsoft hat die Art und Weise, wie Fortschrittsbalken in Vista funktionieren, so geändert, dass es nicht sofort in die angezeigte Position springt, sondern allmählich darauf gleitet. Dies bedeutet, dass Ihr Fortschritt tatsächlich beendet werden kann, aber die Leiste zeigt dies für eine weitere Sekunde nicht an. Daher sieht es so aus, als wäre der Dialog geschlossen, bevor Sie fertig sind, besonders wenn die Leiste eine kleine Anzahl von Fortschrittsschritten aufweist.

Es ist ein bisschen hässlich, aber man kann durch die Verwendung einer Hilfsfunktion dieses Problem umgehen, die so etwas wie dies funktioniert:

procedure UpdateProgressBar(bar: TProgressBar); 
begin 
    bar.StepIt; 
    bar.Max := bar.Max + 1; 
    bar.Max := bar.Max - 1; 
end; 

Dadurch wird sichergestellt, dass es sofort in die richtige Position springt.

EDIT: Details in How do I make TProgressBar stop lagging?

+0

+1 @Mason Nun, da du das sagst, habe ich den Effekt gesehen, den du beschreibst. Ist das irgendwo dokumentiert, wo du es kennst oder hast du es aus Erfahrung gelernt ?! –

+0

@David: Ich habe das tatsächlich von StackOverflow erfahren. Einen Link in der Bearbeitung hinzugefügt. –

Verwandte Themen