Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TThread blockiert Hauptfenster (https://www.delphipraxis.net/17203-tthread-blockiert-hauptfenster.html)

manuel 1. Mär 2004 08:56


TThread blockiert Hauptfenster
 
Hi Leute,

ich weiss, das ist die x-te Frage zu diesem Thema,
aber irgendwie hab ichs noch nicht so ganz gebacken bekommen:

Ich habe mit idFTP einen mickrigen FTP Client geschrieben und
die Anweisungen zu downloaden eines Files in einen Thread (TThread) gepackt.

Das Problem ist jetzt, dass der abgespaltete Thread das Hauptfenster blockiert.
Die Threadpriorität habe ich testweise sogar auf "idle" gesetzt. Ohne Erfolg.

idFTP liefert nach jedem empfangenen IP-Paket löst ein OnWork Event aus.
selbst wenn ich in einem passenden Event-Handler den Thread unterbreche, die
notwendigen felder aktuallisiere und dann den Thread fortsetzte, bleibt das Fenster eingefroren, bis der Thread beendet ist.

Folgende Lösung habe ich bereits gefunden:
die AntiFreeze-Compo von Indy.
Das kann meiner meinung nach aber nicht der Weisheit letzter Schluss sein.
Threads sollen das Hauptprogramm ja entlasten und nicht blockieren.

Für Ideen und Anregungen wäre ich dankbar.

Gruß

manuel

[edit=sakura] Bevor Du wieder nachfragst, warte erst einmal ca. 24 Stunden. Innerhalb dieser Zeit wird i.A. jemand antworten. :warn: Mfg, sakura[/edit]

sakura 1. Mär 2004 10:24

Re: TThread blockiert Hauptfenster
 
Lies bitte meine Anmerkung im ersten Beitrag :!:

Zitat:

Zitat von manuel
Folgende Lösung habe ich bereits gefunden:
die AntiFreeze-Compo von Indy.
Das kann meiner meinung nach aber nicht der Weisheit letzter Schluss sein.
Threads sollen das Hauptprogramm ja entlasten und nicht blockieren.

Erkläre mal, wie Du das meinst. IdAntiFreeze macht doch genau das, was Du willst. Es lagert die "Waits" aus, um so den Hauptthread zu entlasten und nicht zu blockieren...

...:cat:...

manuel 1. Mär 2004 10:32

Re: TThread blockiert Hauptfenster
 
@Sakura:
Ok das warten werd ich mir fürs nächste mal merken :oops:

Sicher, idAntiFreeze erledigt genau das gewünschte. Ich kann mir aber nicht vorstellen, dass das der sinnvollste weg ist.
Wenn ich in Java Threads programmiere, dann blockieren die sich auch nicht gegenseitig. Ich dachte in Delphi wäre das genauso.

Aber wenn du sagst, dass es nicht so ist, dann werd ich die AntiFreeze-Komponente nutzen. Dachte nur, es gäbe eine elegantere Lösung...

ciao
manuel

sakura 1. Mär 2004 10:38

Re: TThread blockiert Hauptfenster
 
Eigentlich sollte es mit normalen Threads auch gehen - hatte den Teil nicht gleich korrekt verstanden :oops: Dazu sollten sich hier eigentlich auch Beispiele finden lassen. Wie dem auch sei, da Du eh schon die Komponenten nutzt, ist TIdAntiFreeze sogar das eleganteste im Sinne: der geringste Aufwand mit dem größtmöglichen Nutzen ;)

...:cat:...

manuel 1. Mär 2004 10:44

Re: TThread blockiert Hauptfenster
 
Die "normalen" nonVCL Threads hab ich nicht genutzt.
In die muss ich mich erst noch einarbeiten.

Dann werde ich wohl bei der AntiFreeze Compo bleiben.
Hat mich halt nur gewundert, dass es sich so verhält, wie es sich verhält.

Vielen Dank für die schnelle Antwort :hi:

manuel

Luckie 1. Mär 2004 11:53

Re: TThread blockiert Hauptfenster
 
Wie hast du denn Synchronize aufgerufen?

manuel 1. Mär 2004 12:25

Re: TThread blockiert Hauptfenster
 
Gibts da unterschiede beim aufrufen von Synchronize?

Delphi-Quellcode:

procedure TDownloadThread.Execute;
begin
  { Place thread code here }
  self.Priority:=tplower;
  Synchronize(load);
end;

procedure TDownloadThread.load;
begin
progress_form.lbl_file.Caption:=filename_dest;
//auf mainform befindet sich die TidFTP-Komponente
mainform.FTP1.Get(filename_source, filename_dest, true);

end;

sakura 1. Mär 2004 12:27

Re: TThread blockiert Hauptfenster
 
Zitat:

Zitat von Luckie
Wie hast du denn Synchronize aufgerufen?

Erst dachte ich, was soll die Frage... aber nun :shock:

Ja, solange die Methode Load über Synchronize aufgerufen wird, blockiert diese den Hauptthread und dadurch blockierst Du die Anwendung, da Du in der Methode den Download durchführst :shock: Soweit habe ich nicht gedacht.

...:cat:...

Brüggendiek 1. Mär 2004 12:32

Re: TThread blockiert Hauptfenster
 
Hallo manuel!

:wall: - das tut ja weh!

Du läßt die ganze Arbeit im Syncronize erledigen. Syncronize verlagert aber die Arbeit in den Haupt-Thread! Dann brauchst Du keine Threads.

Wenn ein Thread was auf dem Bildschirm ausgeben soll, ist Syncronize nötig. Sonst kommen sich die einzelnen Threads in die Quere - die VCL ist nunmal nicht Thread-sicher. Die Produktion niemals im Synchronize ablaufen lassen!

Gruß

Dietmar Brüggendiek

Edit: Die Katze war schneller - klar, Katzen sind schneller als Menschen :mrgreen:

manuel 1. Mär 2004 12:35

Re: TThread blockiert Hauptfenster
 
Da hätte ich eigentlich auch sebst drauf kommen können. :wall:
Liegt ja auf der Hand, wenn die Kompo aufm Hauptformular liegt.
Das heisst, ich muss alles im Thread selbst erledigen.

@Brüggendiek

Tja, das kommt davon wenn man nicht ganz fit in Delphi ist, und dann anfängt zu tippen ohne an die Eigenheiten zu denken..
Mein Fehler :oops:

Vielen Dank für die Hilfe...

manuel


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz