Zitat von
Muetze1:
Ein paar Fragen zu deinem Code:
1. Warum definierst du den Constructor deines Threads als virtuell?
2. Warum setzt du FreeOnTerminate vor dem Inherited Aufruf im Constructor?
3. Warum deklarierst du eine virtual abstrakte Methode, wenn es keine Ableitung von dem Thread gibt?
4. Wieso greifst du unsynchronisiert auf die Form und deren Komponenten zu?
5. Warum verwendest du die globale Form1 Variable anstatt z.B. eine richtige Instanz dem Thread zu übergeben?
6. Wozu deklarierst du ein Sender: TObject in deinem Thread?
7. Warum benutzt du globale Variablen in dem Thread?
8. Warum vergleichst du eine boolsche Variable auf explizit auf true?
9. Warum legst du den Thread suspended an um ihn dann sofort loslaufen zu lassen?
Das Beispiel, was ich hier reingepostet habe, war eigentlich ein testprogramm,
ich versuchte an einem einfacheren Beispiel zu verstehen, wie das ganze funktioniert.
Aber nach eueren Antworten sehe ich, dass die sache mit der Checkbox ein totales blödsinn von mir war.
In wirklichkeit geht es um ein gerät, das mittels serielle schnittstelle mit meinem programm verbundet ist. An das gerät sende ich in einer unendlichen schleife ein Kommando, was sein Status abfrägt und ein Kommando , was die messdaten am display anfordert.
Dieser Schleife ist in einem TTread verkapselt. Das gerät hat zwei Status-Modi...
Wenn ich Status-1 abfange, will ich aus der schleife raus, etwas machen, z.B andere Kommandos an gerät senden und von ihm daten empfangen. Wenn diese Porcedure fertig ist, will ich dass die Schleife die Status abfrägt, weiter läuft.
Wozu das ganze..so kann ich z.B Tasten-Drück am gerät abfangen und gleichzeitig aktuelle Display -Werte in meinem porgramm zu sehen bekommen.
ich habe das ganze bis jetzt ohne suspend ....mit einer StopVariable von typ boolean erledigt
es läuft aber irgendwie unsicher...manchmal wenn ich auf dem Form StopTaste oder StartTaste klicke
springt der Fokus sofort auf die andere TAste dann wieder zurück...
Was ich wollte, dass procedure TMyThreads.Execute sich von alleine schlafen legt und wenn der Code in proceduren
Form1.StartTasteClick(Sender) und Form1.StopTasteClick(Sender) bis zur Ende durgelaufen ist..dann weiter läuft.
Delphi-Quellcode:
procedure TMyThreads.Execute;
var
Label 10,20,30;
begin
Form1.Edit11.Text:='Ende';
while(not Terminated)do
begin
10:Application.ProcessMessages;
If StopVariable=true then
begin
CP.RTS(1);
CP.SENDSTRING('sta,g'+chr(13)+chr(10));
status:=cp.READSTRING();
If trim(Status)='E 01' then goto 10;
If trim(Status)='' then goto 10;
Form1.Edit6.Text:='begin';
Sleep(100);
If (trim(Status)='04') and (StopJa=true) then
begin
Form1.StopTasteClick(Sender);
end;
If (trim(Status)='00') and (StopJa=true) then
begin
Form1.StopTasteClick(Sender);
end;
If (trim(Status)='02')and (StartJa=true) then
begin
Form1.StartTasteClick(Sender);
end;
/// Die letzten aktuellen Messwerten bekommen
20: CP.SENDSTRING('dis,g'+chr(13)+chr(10));
Distanz:=cp.READSTRING();
Distanz:=trim(Distanz);
If (length(Distanz)<11) or (length(Distanz)>11) then goto 20;
Sleep(50);
Test:='okkkkkkkkkkkkkk';
30: CP.SENDSTRING('kmh,g'+chr(13)+chr(10));
Speed:=cp.READSTRING();
Speed:=trim(Speed);
If (length(Speed)<3) and (length(Speed)>5) then goto 30;
Form1.Edit6.Text:='untennnnnnnnnnn';
///*
end ;
Synchronize(Go);
end;
end;