Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   wiedermal funzt synchronize im TThread nicht (https://www.delphipraxis.net/140249-wiedermal-funzt-synchronize-im-tthread-nicht.html)

BAMatze 14. Sep 2009 14:21


wiedermal funzt synchronize im TThread nicht
 
Hallo,

ich weiß zu diesem Thema gibt es 1000de Beispiele auf dieser Seite. Ich habe auch versucht mich exakt an diese zu halten aber am Ende bleibt mein Synchronize im TThread anscheinend für meinen Compiler unbeachtet, zumindest in sofern dass er nur 1mal (anscheinend ausgeführt wird). Folgendes steht in meiner Excecute-procedure im TThread:

Delphi-Quellcode:
Type TControlCardControlThread = class(TThread)
  ...
  protected
    procedure Execute; override; // ist override
   ...
end;

procedure TControlCardControlThread.Execute;
var c, iIndex: integer;
    //TempTisch: TTischInfo;
    //Punkte, Geschwindigkeiten, Beschleunigungen: array[1..3] of double = [0,0,0];
   
begin
  repeat
  c := GetTickCount;
  Synchronize(Form3.Sync);
  c := {interval}50 - (GetTickCount - c);
  if c > 0 then Sleep(c);
  until Terminated;
die Form3.Sync:
Delphi-Quellcode:
procedure TForm3.Sync;
var
  i: Integer;
begin

  for i := 1 to 2 do Form3.LoadProgressBarValue(i, ReadanalogChannel(i));

  for i := 1 to 5 do Form3.CheckBoxCheck(i+8, (not ReaddigitalChannel(i)));

  if ReadDigitalChannel(5) then Form2.EingangsSignal[1] := 256
  else Form2.EingangsSignal[1] := 0;
end;
Meiner Meinung nach sollte ich jetzt alles beachtet haben, was ich so in mehreren anderen Threads hier in der DP beachten, was ich beachten sollte (Excecute-Procedure ist override, repeat ... until Terminated, Trennung des TThread von den visuellen Komponenten des Hauptthreads), denke ich. Warum wird beim Debuggen dann aber die Sync-Procedure nur 1 mal ausgeführt? :gruebel:
Hoffe ihr könnt mir wieder helfen.

BAMatze

Klaus01 14. Sep 2009 14:35

Re: wiedermal funzt synchronize im TThread nicht
 
Delphi-Quellcode:
Type
TControlCardControlThread = class(TThread)
  private
   procedure updateForm3;
  ...
  protected
    procedure Execute; override; // ist override
   ...
end;


procedure TControlCardControlThread.updateForm3;
begin
  Form3.sync;
end;

procedure TControlCardControlThread.Execute;
var c, iIndex: integer;
    //TempTisch: TTischInfo;
    //Punkte, Geschwindigkeiten, Beschleunigungen: array[1..3] of double = [0,0,0];
   
begin
  repeat
  c := GetTickCount;
  Synchronize(updateForm3);
  c := {interval}50 - (GetTickCount - c);
  if c > 0 then Sleep(c);
  until Terminated;
Ist es nicht so, dass eine Methode des Thread "synchronisiert" werden sollte.
Vielleicht klappt esja mit den Änderungen oben.

Grüße
Klaus

BAMatze 14. Sep 2009 14:43

Re: wiedermal funzt synchronize im TThread nicht
 
@Klaus leider keine Änderung.

Klaus01 14. Sep 2009 14:53

Re: wiedermal funzt synchronize im TThread nicht
 
Wenn Du einen Haltepunkt in Form3.sync setzt
wird dann während der Ausführung dort nur einmal angehalten?

Sehr merkwürdig.

Grüße
Klaus

BAMatze 14. Sep 2009 14:59

Re: wiedermal funzt synchronize im TThread nicht
 
Zitat:

Zitat von Klaus01
Wenn Du einen Haltepunkt in Form3.sync setzt
wird dann während der Ausführung dort nur einmal angehalten?

Sehr merkwürdig.

Grüße
Klaus

Ja beim starten geht er einmal in diese Procedure und danach anscheinend nicht mehr, zumindest durch den Debugger werde ich nicht mehr in die Procedure geführt.

Klaus01 14. Sep 2009 15:02

Re: wiedermal funzt synchronize im TThread nicht
 
Zitat:

Zitat von BAMatze
Zitat:

Zitat von Klaus01
Wenn Du einen Haltepunkt in Form3.sync setzt
wird dann während der Ausführung dort nur einmal angehalten?

Sehr merkwürdig.

Grüße
Klaus

Ja beim starten geht er einmal in diese Procedure und danach anscheinend nicht mehr, zumindest durch den Debugger werde ich nicht mehr in die Procedure geführt.

.. mal eine dumme/ketzerische Frage, der Thread besteht aber noch nachdem die Prozedure durchlaufen wurde?

[edit] oder wird der Thread irgendwo suspendiert?

Grüße
Klaus

Tryer 14. Sep 2009 15:15

Re: wiedermal funzt synchronize im TThread nicht
 
Das könnte helfen (wobei es ungewöhnlich ist das nur ein einziger Event durchkommt):
Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
begin
  WakeMainThread := Wake;
end;

procedure TForm3.Wake(Sender: TObject);
begin
  PostMessage(Handle, WM_NULL, 0, 0);
end;


procedure TForm3.FormDestroy(Sender: TObject);
begin
  WakeMainThread := Application.WakeMainThread;
end;
Dadurch wird die Synchronisieranforderung direkt an Form3 gesendet.

MfG,
Dirk

Assertor 14. Sep 2009 15:21

Re: wiedermal funzt synchronize im TThread nicht
 
Hi BAMatze,

wie und wo erstellst Du die Instanz Deines Threads?

Gruß Assertor

BAMatze 14. Sep 2009 19:33

Re: wiedermal funzt synchronize im TThread nicht
 
Also erstmal danke an alle für eure Beiträge, bin jetzt erst zu Hause angekommen.
Der TThread wird am Anfang mit einer Komponente erzeugt, welche das ControlBord steuert, welche die analogen Signale an das Programm schickt. Dieser TThread wird erst am Ende, wenn diese Komponente terminiert wird aufgelöst.
@Tryer werde deinen Quellcode morgen mal ausprobieren, danke.

Vielen Dank
BAMatze


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:34 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