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