Einzelnen Beitrag anzeigen

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, 11: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