![]() |
Verständnisfrage Thread...
Hallo,
vielleicht hab ich ja die falschen Vorstellungen, aber sollte ein Thread nicht unabhänging vom Rest (Mainthread ) laufen ? Ich habe im Mainform eine globale boolsche Variable "Running". Der Thread ist eine globale Variable MeinThread:TMeinThread; Nach Klick auf Start wird der Thread erzeugt und läuft in einer while Running=true Schleife ewig durch. Das löppt soweit. Setzt das Mainform running auf false wird die Schleife verlassen und der Thread "zerstört". Mein Problem: Mache ich irgendwas anderes auf dem Mainform, z.B. ein Menue öffnen dann bleibt der Thread stehen. Welchen Denkfehler hab ich da ? Danke und Gruss Calli |
AW: Verständnisfrage Thread...
Über Quelltext zu reden ist wie über Architektur zu tanzen.
Zeig uns doch mal was, weil so ist das Glaskugel wischen. :glaskugel: |
AW: Verständnisfrage Thread...
Sorry :-)
Delphi-Quellcode:
// Globale Variable in MainUnit: var OutputEngine:TOutputEngine; // Deklaration in anderer Unit: type TOutputEngine = class(TThread) Private public RunActive:Boolean; constructor Create; destructor Destroy; override; procedure Execute(); override; Procedure PreRun; Procedure PostRun; end; // StartButton im Mainform: OutputEngine:=TOutputEngine.Create; OutputEngine.Priority := tpHigher; OutputEngine.RunActive:=true; OutputEngine.Execute; // Dann in Schleife Procedure TOutputEngine.Execute; var i:Integer; Time:Word; Begin PreRun; Time:=0; while RunActive=true do Begin // Arbeite diverses Elend ab so lange Runactive=true; End; application.ProcessMessages; End; PostRun; End; |
AW: Verständnisfrage Thread...
Meine Glaskugel sagt mir er hat thread.Execute statt thread.Start aufgerufen :glaskugel:
Edit: Mist! Ich hab den Code vorher wirklich nicht gesehen bevor ich gepostet hab! :mrgreen: |
AW: Verständnisfrage Thread...
Ach ja,
und dieses "Arbeite diverses Elend ab..." wird unterbrochen wenn ich im Mainform z.B. ein Mainmenue öffne... Gruss Calli |
AW: Verständnisfrage Thread...
Zitat:
Außerdem muss das application.ProcessMessages; aus dem Thread raus! |
AW: Verständnisfrage Thread...
Vielleicht ist in dem Elend auch noch ein application.ProcessMessages; drin ...
|
AW: Verständnisfrage Thread...
Zitat:
|
AW: Verständnisfrage Thread...
@NeutralGeneral,
schön das sich deine Glaskugel offenbar guter Pflege erfreut :-) Mit "Start" statt "Execute" macht der Thread nun teilweise was er soll. Teilweise weil: "Arbeite diverses Elend ab..." endet mit einer OpenGL Ausgabe. Die geht nun nicht mehr. Die Zeichenroutine ist Teil der TOutputengine. Die "TOutputengine.drawGL" hab ich im Codebeispiel unterschlagen. Der Handle für das OpenGL ist eine globale Variable vom Mainform. |
AW: Verständnisfrage Thread...
Zitat:
Du siehst zu, dass die ganze OpenGL Ausgabe rein im Main Thread funktioniert und danach kümmern wir uns darum das Rendering in einen eigenen Thread auszulagern? |
AW: Verständnisfrage Thread...
Danke,
werde ich umbauen sobald meine Regierung mir etwas Freizeit einräumt :-) Gruss Calli |
AW: Verständnisfrage Thread...
Wird aber wohl erst morgen was...
So dankbar ich auch für eine Lösung bin, es wäre aber trotzdem schön wenn mir jemand erklären könnte WARUM das nun plötzlich nicht mehr geht. Nur des Verständnisses wegen.. Auch ist mir der Unterschied zwischen Start und Execute nicht klar. Viel findet man nur in Englisch und mit mitte 60 ist das nicht so meins... Hatte das so verstanden das mit Thread.create das Ding erstellt und und ich dann nur irgendwie meine Schleife starten muss die im erzeugtem Thread läuft. Gruss Calli |
AW: Verständnisfrage Thread...
Zitat:
Der Punkt ist, dass Execute intern quasi aus dem Thread heraus aufgerufen werden muss, damit die Befehle darin auch im Thread laufen. Wenn man selbst Execute aufruft, tut man das ja aus dem Hauptthread heraus und damit bleibt man auch im Hauptthread. Du kannst ja mal einen Haltepunkt in das Execute setzen und einfach mal den Stacktrace anschauen. Vielleicht wird es dann klarer. |
AW: Verständnisfrage Thread...
Hallo,
kurze Rückmeldung von der Front :-) Konnte es nicht sein lassen und hab selber probiert. Vielleicht hilfts ja jemand anderem. Ich hasse Threads wo die Lösung gefunden aber nicht dokumentiert wird..sogar für Dummy´s wie mich :-) Der ganze OpenGL Kram im Mainthread. Der ganze Datenkram die die einzelnen Threads sammeln kommmt in public Arrays des jeweiligem Threads. Wenn alle Geräte abgearbeitet sind kommt ein Synchronize(form1.updategui); updategui holt sich dann in einer Schleife die Daten aus den Einzelthreads und zeichnet. Gehen tuts...ob es so die "feine Englische Art" ist weiss ich nicht... Leider hab ich noch eine Baustelle mit der ich euch gern belästigen würde. Hab die Frage auch schon öfter gefunden , leider nur mit Antworten wie "guck da...sieht man doch..." Es geht um die dynamische Erzeugung eines TIDUDPServers.
Delphi-Quellcode:
Was ich nicht hinbekomme ist die eigene Deklaration der ReadUDP Prozedur sowie des
try
FSocket := TIdUDPServer.Create(nil); FSocket.ThreadedEvent := True; FSocket.DefaultPort := Artnet_Port; FSocket.ThreadedEvent:=true; FSocket.ReuseSocket:=rstrue; // FSocket.OnUDPRead := ReadUDP; FSocket.BroadcastEnabled := True; FSocket.Active := True; except end Aufrufes FSocket.OnUDPRead:= ??? Im Grunde macht es vielleicht Sinn das auch in einen eigenen Thread auszulagern und auch mit Sycronize zu arbeiten. Danke und Gruss Calli |
AW: Verständnisfrage Thread...
Bitte erstelle für eine neue Frage, die offensichtlich nichts mit der ursprünglichen zu tun hat, ein neues Forumsthema.
|
AW: Verständnisfrage Thread...
Zitat:
OK strict protected wäre besser, und es wäre unklug, wenn man beim Ableiten/Überschreiben die Sichtbarkeit dieser Methode verändert. (vergisst das Protected anzugeben und es z.B. nach Public verschiebt) |
AW: Verständnisfrage Thread...
Zitat:
|
AW: Verständnisfrage Thread...
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 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