Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Verständnisfrage Thread... (https://www.delphipraxis.net/195225-verstaendnisfrage-thread.html)

calibra301 13. Feb 2018 08:10

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

TiGü 13. Feb 2018 08:45

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:

calibra301 13. Feb 2018 08:53

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;

Neutral General 13. Feb 2018 08:54

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:

calibra301 13. Feb 2018 08:54

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

Neutral General 13. Feb 2018 08:56

AW: Verständnisfrage Thread...
 
Zitat:

Zitat von calibra301 (Beitrag 1393717)
Ach ja,

und dieses "Arbeite diverses Elend ab..." wird unterbrochen
wenn ich im Mainform z.B. ein Mainmenue öffne...

Gruss
Calli

Siehe meine Glaskugel-Antwort eins drüber.
Außerdem muss das application.ProcessMessages; aus dem Thread raus!

freimatz 13. Feb 2018 09:07

AW: Verständnisfrage Thread...
 
Vielleicht ist in dem Elend auch noch ein application.ProcessMessages; drin ...

freimatz 13. Feb 2018 09:08

AW: Verständnisfrage Thread...
 
Zitat:

Zitat von calibra301 (Beitrag 1393717)
und dieses "Arbeite diverses Elend ab..." wird unterbrochen

Kann ja gar nicht sein, dass ist ja nur ein Kommentar. Du hast uns schon wieder Quelltext unterschlagen :twisted:

calibra301 13. Feb 2018 10:02

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.

TiGü 13. Feb 2018 10:16

AW: Verständnisfrage Thread...
 
Zitat:

Zitat von calibra301 (Beitrag 1393725)
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.

Machen wir einen Deal:
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?

calibra301 13. Feb 2018 11:07

AW: Verständnisfrage Thread...
 
Danke,

werde ich umbauen sobald meine Regierung mir etwas Freizeit einräumt :-)

Gruss
Calli

calibra301 13. Feb 2018 11:29

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

jaenicke 13. Feb 2018 12:03

AW: Verständnisfrage Thread...
 
Zitat:

Zitat von calibra301 (Beitrag 1393739)
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.

Ja, fehlende Englischkenntnisse sind nicht gerade förderlich. ;-)

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.

calibra301 16. Feb 2018 07:48

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:
 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
Was ich nicht hinbekomme ist die eigene Deklaration der ReadUDP Prozedur sowie des
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

TiGü 16. Feb 2018 09:03

AW: Verständnisfrage Thread...
 
Bitte erstelle für eine neue Frage, die offensichtlich nichts mit der ursprünglichen zu tun hat, ein neues Forumsthema.

himitsu 16. Feb 2018 09:50

AW: Verständnisfrage Thread...
 
Zitat:

Zitat von jaenicke (Beitrag 1393746)
Wenn man selbst Execute aufruft

Darum ist Execute auch eigentlich PROTECTED, denn so kann man es garnicht erst von außen aufrufen.
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)

jaenicke 16. Feb 2018 11:19

AW: Verständnisfrage Thread...
 
Zitat:

Zitat von himitsu (Beitrag 1394004)
vergisst das Protected anzugeben und es z.B. nach Public verschiebt)

So wie in diesem Fall. Beim Überschreiben macht es natürlich Sinn darauf zu achten welche Sichtbarkeit die Methoden vorher hatten. Aber wenn man nicht weiß wie es funktioniert, macht man das vielleicht ja auch absichtlich, weil man es für die richtige Vorgehensweise hält.

Delphi-Laie 16. Feb 2018 12:49

AW: Verständnisfrage Thread...
 
Zitat:

Zitat von calibra301 (Beitrag 1393715)
Delphi-Quellcode:
RunActive=true

Es stirbt einfach nicht aus, es ist zum Mäusemelken: Laß das überflüssige "=true" weg!


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:23 Uhr.

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