Folgende Prozedur als OnClick-Event des Buttons spinnt:
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
if dclk.value = false then label1.Caption := 'false' else label1.Caption := 'true';
While Dclk.Value = false do
begin
label2.caption := 'Running';
end;
end;
Bekloppter Code, ich weiss. Ist auch nur eine Simplifizierung um das Problem darzustellen: Solange Dclk.Value = false ist passiert gar nichts, erst wenn er auf true wechselt (dafür lege ich den Pin kurz auf Vcc, die GPIO-Auswertung funzt also) werden beide Label-caption-Befehle ausgeführt (also auch der vor der Schleife, mit der Anzeige 'false' natürlich da das der Status zum Zeitpunkt des Label.caption Befehls war). Ach ja, solange der Pin nicht auf true wechselt bleibt der Button nach dem Klick grau als ob er gerade gedrückt würde, das Progamm friert komplett ein und kann nur abgeschossen werden.
Irgendeine Idee was da schief läuft?
Und noch eine weitere Frage hinterher: Ich würde gerne eine Art Watchdog programmieren der die Schleife nach einer Zeit X abbricht.
Von AVRs bin ich es gewohnt einen Timer zu starten dessen ISR nach eben dieser Zeit ein Flag setzt welches dann in der Schleife ausgewertet wird und diese abbricht.
Mein Versuch: 'Flag' wird im FormCreate auf '0' gesetzt, in der Timer-ISR wird 'Flag' dann auf 1 geändert. Im Objektinspektor ist Timer1 disabled.
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
if dclk.value = false then label1.Caption := 'false' else label1.Caption := 'true';
timer1.enabled := true;
While Dclk.Value = false do
begin
if Flag = 1 then break;
label2.caption := 'Running';
end;
end;
Funktioniert nicht, auch die Label werden nicht angezeigt.
Aber jetzt wirds schräg: Wenn ich im Objektinspektor den Timer direkt enable dann funktionierts, inklusive Anzeige des _ersten_ Labels...aber nur dann wenn ich den Button erst _nach_ Ablauf der Timerzeit klicke. D.h. das Flag wird dann auch innerhalb der Schleife ausgewertet und das _erste_ Label angezeigt - das zweite aber wiederum nicht! Die while...do Schleife blockiert also auch den Timer so dass er das Flag nicht setzen kann, er muss schon vor Start der Schleife das Flag gesetzt haben. Dann wird auch die Schleife verlassen und das Programm kann auch normal beendet werden...nur der zweite Label-Befehl wird nicht ausgeführt, obwohl die Schleife mit diesem Befehl ja x-mal durchlaufen worden sein muss. Warum ich das erwähne: Vertausche ich die Reihenfolge der Flagauswertung und des Label-Befehls...
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
if dclk.value = false then label1.Caption := 'false' else label1.Caption := 'true';
timer1.enabled := true;
While Dclk.Value = false do
begin
label2.caption := 'Running';
if Flag = 1 then break;
end;
end;
... dann wird das zweite Label auch angezeigt.
Ich stehe irgendwie total auf dem Schlauch...