![]() |
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] |
Re: TThread blockiert Hauptfenster
Lies bitte meine Anmerkung im ersten Beitrag :!:
Zitat:
...:cat:... |
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 |
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:... |
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 |
Re: TThread blockiert Hauptfenster
Wie hast du denn Synchronize aufgerufen?
|
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; |
Re: TThread blockiert Hauptfenster
Zitat:
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:... |
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: |
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. |
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