Delphi-PRAXiS
Seite 1 von 2  1 2   

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 Uhr.
Seite 1 von 2  1 2   

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