![]() |
TThread, irgendwas mache ich falsch
Hallo, im folgenden zeige ich eine Pseudo-Funktion die einen Thread startet, trotzdem friert das Programm ein, ich finde nicht meinen Fehler, fällt jemand auf was ich falsch mache dann bitte Hilfe! :thumb:
Ziel sollte sein den Mainthread zu entlasten aber nach wie vor als eine Funktion zu arbeiten wenn im Hauptcode angesprochen (deswegen repeat schleife)
Delphi-Quellcode:
edit
function TFormMain.Machwas ( Const Input : String ) : String;
var tmp : String; threadrun: boolean; begin threadrun := True; TThread.CreateAnonymousThread( procedure var IchBraucheDieseVars: Definitionen; begin tmp := ''; IchBraucheDieseVars := IrgendWas.Create; try tmp := IchBraucheDieseVars.GibMirEinenStringVonWoanders(Input); finally IchBraucheDieseVars.Free; end; threadrun := False end ).Start; repeat sleep(5) until not threadrun; Result := tmp; end; Mit einfrieren meine ich nicht dass das Programm abstürzt sondern hängen bleibt bis funktion fertig ist. PS: Es friert auch nicht wegen hoher Cpu Last ein, die ist lächerlich gering. |
AW: TThread, irgendwas mache ich falsch
Dein Hauptthread besteht ausschließlich aus dieser Zeil
Delphi-Quellcode:
repeat sleep(5) until not threadrun;
und nun überlege mal ganz genau was da gemacht wird und wieso es da hängen muß. Und sollte es mal beim Free knallen, dann bleibt es auch gleich für immer hängen. |
AW: TThread, irgendwas mache ich falsch
Durch die Zeile
Delphi-Quellcode:
nach .Start; hebst du die Wirkung des Threads wieder komplett auf.
repeat sleep(5) until not threadrun;
|
AW: TThread, irgendwas mache ich falsch
Moin...:P
Ich weiß nicht wie weit du drinsteckst...es hilft vieleicht (TThread Grundlagen): ![]() |
AW: TThread, irgendwas mache ich falsch
Wäre dafür nicht das Konzept Futures aus der Delphi Parallel Library. Schau mal unter:
![]() ![]() |
AW: TThread, irgendwas mache ich falsch
Das Problem hier wird sein, dass er eine Funktion als Thread ausführen möchte, aber gleichzeitig im Mainthread auf das Ergebnis warten muss.
|
AW: TThread, irgendwas mache ich falsch
Zitat:
Im Thread oder sonstwo was machen, im Hauptthread darauf warten, aber dem Hauptthread Rechenleistung abgeben. (ProcessMessages) Oder im Thread was machen, im Hauptthread nicht warten und bei ThreadEnde den Hauptthread benachrichtigen (Callback, Message oder Dergleichen), bzw. im Hauptthread regelmäßig schauen ob fertig und dann das Ergebnis abholen (pollen > Timer). Und da der Thread selber auch nichts macht, wäre noch die Überlegung, ob ein Thread überhaupt notwendig ist. Datei- und Streamingfunktion und auch irgendwelches INet-Download-Zeugs (ich vermute mal um Letzteres geht es) muß nicht immer blockierend arbeiten, was sich dann ebenfalls mit Erster und den anderen Lösungen kombinieren ließe. |
AW: TThread, irgendwas mache ich falsch
Zitat:
Gruß K-H |
AW: TThread, irgendwas mache ich falsch
@p80286: Du hast seinen Code und diese Aussage falsch verstanden.
Diese Schleife hat nichts mit dem Thread zu tun. Sie soll nur warten und dafür ist "diese" Schleife garnicht nötig. Einfache Abänderung, mit dem selben Ergebnis: Ein Event und WaitFor statt dieser Schleife. Er kann bei sich auch das Sleep weglassen. Dann ist der Code kürzer, das Warten verbrät 100% CPU, aber sonst ändert sich nichts. |
AW: TThread, irgendwas mache ich falsch
Ein generelles Problem...
Es gibt im Hauptthread keine Procedure Execute_Modal_In_Thread;. Wie himitsu schon geschrieben hat... Ein
Delphi-Quellcode:
Geht leider nicht...
Procedure Button1Click(Sender : TObject);
begin MachWaslangesImThread; IchWarteHiersolangenonBlocking; end; Alle Repeat Processmessages Until Konstrukte verbraten nur mehr CPU-Zeit, als wenn man es direkt im UI-Thread erledigt hätten. Also die Logik umbauen auf.
Delphi-Quellcode:
Wird zwar dadurch nicht schneller, aber die Oberfläche bleibt reaktiv.
Procedure Button1Click(Sender : TObject);
begin ShowWait; MachWaslangesImThreadAsync(Procedure (Data : TData) begin IcharbeitemitdemErgebnis(Data); HideWait; end); end; Multithreading lohnt sich "eigentlich" nur da, wo der User nicht unbedingt auf ein Ergebnis wartet. Beispiel (Schönwetter Code, wie Bernd sagen würde) :
Delphi-Quellcode:
Nur mal so als Anregungen.
Procedure SaveButton(Sender : TObject);
begin SaveButton.Enabled := false; TTask.Run(Procedure begin SpeicherdieDaten; TThread.Queue(NIL,Procedure begin ShowFlyInMessage('Daten gespeichert'); SaveButton.Enabled := true; end; end); end; Mavarik :coder: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 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