AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein wiedermal funzt synchronize im TThread nicht
Thema durchsuchen
Ansicht
Themen-Optionen

wiedermal funzt synchronize im TThread nicht

Ein Thema von BAMatze · begonnen am 14. Sep 2009 · letzter Beitrag vom 14. Sep 2009
Antwort Antwort
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

wiedermal funzt synchronize im TThread nicht

  Alt 14. Sep 2009, 15:21
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?
Hoffe ihr könnt mir wieder helfen.

BAMatze
2. Account Sero
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: wiedermal funzt synchronize im TThread nicht

  Alt 14. Sep 2009, 15:35
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
Klaus
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: wiedermal funzt synchronize im TThread nicht

  Alt 14. Sep 2009, 15:43
@Klaus leider keine Änderung.
2. Account Sero
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: wiedermal funzt synchronize im TThread nicht

  Alt 14. Sep 2009, 15:53
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
Klaus
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: wiedermal funzt synchronize im TThread nicht

  Alt 14. Sep 2009, 15:59
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.
2. Account Sero
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: wiedermal funzt synchronize im TThread nicht

  Alt 14. Sep 2009, 16:02
Zitat von BAMatze:
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
Klaus
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#7

Re: wiedermal funzt synchronize im TThread nicht

  Alt 14. Sep 2009, 16:15
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
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#8

Re: wiedermal funzt synchronize im TThread nicht

  Alt 14. Sep 2009, 16:21
Hi BAMatze,

wie und wo erstellst Du die Instanz Deines Threads?

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: wiedermal funzt synchronize im TThread nicht

  Alt 14. Sep 2009, 20:33
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
2. Account Sero
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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