AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein TThread reagiert unterschiedlich schnell
Thema durchsuchen
Ansicht
Themen-Optionen

TThread reagiert unterschiedlich schnell

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

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

TThread reagiert unterschiedlich schnell

  Alt 24. Sep 2009, 12:28
Hallo und guten Tag an alle,

Hab nochmal eine Frage zu TThreads. Undzwar habe ich jetzt meinen Thread für mein Programm fertig, aber aus irgendwelchen, mir nicht wirklich verständlichen Gründen, reagiert dieser nicht so wie ich mir das vorstelle sondern eher konfus und chaotisch.

erstmal hier die wichtigsten (Execute- und Update- Funktion des Threads, weil hier der sprichwörtliche Hund begraben sein muss)

Delphi-Quellcode:
procedure TControlCardControlThread.Execute;
var c, iIndex: integer;
    
begin
  repeat
  c := GetTickCount;
  Synchronize(UpdateForm3); // gemäß Tutorial alle Interaktionen mit der Oberfläche über Synchronize
  c := {interval}50 - (GetTickCount - c);
  if c > 0 then Sleep(c);
until Terminated;
end;

{////////////////////////////////////////////////////////////////////////////////////}
{/                           Interaktion mit Oberfläche                             /}
{////////////////////////////////////////////////////////////////////////////////////}


procedure TControlCardControlThread.UpdateForm3;
var i: integer;
    bGeneralDigChannelInput, bCriticalDigChannelInput: boolean;
begin
  if Board.digEingang[1] then Form3.Statusbar1.Panels[1].Text := 'oben'
  else Form3.Statusbar1.Panels[1].Text := 'unten';
  bgeneralDigChannelInput := false;
  bcriticalDigChannelInput := false;
  for i := 1 to 5 do
    begin
      case not(FabDigChannelSignals[i] xor Board.digEingang[i]) of // wenn Werte unterschiedlich sind, dann muss etwas getan werden
      false: begin
               // Tätigkeiten wenn sich etwas an einem der 5 digitalen Eingänge getan hat
               DoSingleDigChannelInput(i); // verweißt auf ein Event, das den den Eingang mit übergibt
               bGeneralDigChannelInput := true; // boolsche Variable, die später ein Event auslöst, welches angibt ob sich generell etwas geändert hat
               if i in [2..4] then bcriticalDigChannelInput := true; // boolsche Variable, die später ein Event auslöst, wenn einer der kritischen Eingänge ausgelöst wurden.
               FabDigChannelSignals[i] := Board.digEingang[i]; // angleichen des Ausgangszustandes für nächste Prüfung
             end;
      end;
      // optische Anpassung, damit man sehen kann, was intern passiert
      (Form3.findcomponent('CheckBox' + inttostr(i+8)) as TCheckBox).Checked:= fabDigChannelSignals[i];
      if i in [1..2] then (Form3.findcomponent('ProgressBar' + inttostr(i)) as TProgressBar).Position := Board.anaEingang[i]
    end;
  // löst das blinken eines roten Lichtes an der Maschine aus
  if FbBlinkRedLight then Board.RedLight := not Board.RedLight;
  // Eventbehandlung
  if bGeneralDigChannelInput then doGeneralDigChannelInput;
  if bCriticalDigChannelInput then doCriticalDigChannelInput;

  // otpische Anpassung, um zu sehen, ob der Thread läuft
  case Counter of
  0: Form3.StatusBar1.Panels[0].Text := '/';
  1: Form3.StatusBar1.Panels[0].Text := '|';
  2: Form3.StatusBar1.Panels[0].Text := '\';
  3: Form3.StatusBar1.Panels[0].Text := '-';
  end;
  Counter := Counter + 1;
  if Counter > 3 then Counter := 0;
end;
ok folgende "Phänomene sind zu beobachten: die optische Anpassung der Checkboxen erfolgt erst nach einigen Sekunden, hingegen das Blinken des roten Lichtes erfolgt sofort, wenn der digitale Eingang ausgelöst wird. Das anpassen der Checkboxen ist dabei mit unterschiedlich langen Reaktionszeiten zu vermerken.

Warum reagieren einige Elemente in dem Thread unterschiedlich schnell? Was verlangsamt dort eventuell die Reaktionszeit des Threads? Augenscheinlich läuft der Thread konstant, was an dem drehenden Balken optisch erkennbar ist.

Hoffe Ihr könnt mir helfen
BAMatze
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

Re: TThread reagiert unterschiedlich schnell

  Alt 24. Sep 2009, 13:17
Bei manchen Komponenten löst das Ändern eines Properties nicht automatisch ein Neuzeichnen aus, sondern vermerkt lediglich, daß beim nächsten Mal neu gezeichnet werden muss. Du kannst ja mal versuchen, bei den fraglichen Controls ein Refresh aufzurufen, was ein sofortiges Neuzeichnen auslöst.

Eine andere Alternative wäre, die einzelnen Zustände in eigenen Feldern zwischenzuspeichern und die Controls über den Update-Event entsprechender Actions zu aktualisieren. Damit käme das Synchronize eher zurück und der Thread kann eher weiterarbeiten. Wenn du die Zugriffe auf die Felder noch threadsicher gestaltest, kannst du auch auf das Synchronize verzichten.
Uwe Raabe
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: TThread reagiert unterschiedlich schnell

  Alt 24. Sep 2009, 13:18
Zudem ist Windows, kein Echtzeitbetriebssystem. Auf bestimmte feste Laufzeiten kann man sich nie verlassen
Markus Kinzler
  Mit Zitat antworten Zitat
BAMatze

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

Re: TThread reagiert unterschiedlich schnell

  Alt 24. Sep 2009, 13:23
@Uwe und @mkinzler hab jetzt nach meinen Übergaben an die Form3 ein Refresh der Form aufgerufen und zumindest scheint es jetzt sofort zu reagieren. Muss ich sicherlich noch eine Weile beobachten, ob es eventuell doch noch Probleme gibt aber ansonsten ist jetzt alles so, wie ich mir das gedacht hab.

Hier nochmal die ergänzte Zeile im Quellcode:
Delphi-Quellcode:
if Board.digEingang[1] then Form3.Statusbar1.Panels[1].Text := 'oben'
  else Form3.Statusbar1.Panels[1].Text := 'unten';
  bgeneralDigChannelInput := false;
  bcriticalDigChannelInput := false;
  for i := 1 to 5 do
    begin
      case not(FabDigChannelSignals[i] xor Board.digEingang[i]) of
      false: begin
               DoSingleDigChannelInput(i);
               bGeneralDigChannelInput := true;
               if i in [2..4] then bcriticalDigChannelInput := true;
               FabDigChannelSignals[i] := Board.digEingang[i];
             end;
      end;
      (Form3.findcomponent('CheckBox' + inttostr(i+8)) as TCheckBox).Checked:= fabDigChannelSignals[i];
      if i in [1..2] then (Form3.findcomponent('ProgressBar' + inttostr(i)) as TProgressBar).Position := Board.anaEingang[i]
    end;

  if FbBlinkRedLight then Board.RedLight := not Board.RedLight;

  if bGeneralDigChannelInput then doGeneralDigChannelInput;
  if bCriticalDigChannelInput then doCriticalDigChannelInput;

  Form3.Refresh; // <--eingefügt
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 02:20 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