Wiederholungsschleife verlangsamen

Hallo

ich bastle derzeit an einem Programm welches Würfeln simuliert. Am Ende werden die Ergebniss ausgegeben.

Nun möchte ich (als kleinen Nebeneffekt) die Wiederholungsschleife so verlangsamen, dass man sieht wie die Würfe sich mehren, wenn man es möchte (CHeckBox).

Habe es derzeit so gelöst:

procedure TForm1.StartClick(Sender: TObject);
if checkbox1.Checked = True then
 Timer1.Enabled := true
 else
 {Wiederholungsschleife}
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 {Wiederholungsschleife}
end;

Allerdings passiert im moment folgendes:
Wenn die CheckBox nicht aktiv ist, funktioniert das Programm reibungslos. Ist allerdings die TimerProzedure an, wartet das Programm eine Sekunde, führt die Wiederholungsschleife aus und hängt sich auf.

Wie schaffe ich es also das die Wiederholungsschleife immer einen Moment wartet bevor sie erneut beginnt?

Und gibt es evtl. eine ganz andere Lösungsmöglichkeit wo ich die Wiederholungsschleife nicht doppelt schreiben muss?

Danke schonmal im Vorraus :smile:

Grüße

Hallo,

ich habe die Sache nicht überprüft, aber Du solltest in der Timer-Prozedur als erstes den Timer wieder abschalten, denn sonst startet er ja alle Sekunde die Wiederholungsschleife erneut.

Gruß Ebi

Hey,

danke, jetzt hört es hägt es sich zum glück nichtmehr auf :smile:
Aber das Hauptprob besteht leider immernoch.

Grüße

Hallo

Du musst den Timer in der procedure Timer1Timer anhalten:

procedure TForm1.Timer1Timer(Sender: TObject);
begin

 {Hier den Timer stoppen}
 Timer1.Enabled:= False;

 {Wiederholungsschleife}
end;

Am Ende der Wiederholungsschleife (was immer Du da anstellst) den Timer wieder starten

 Timer1.Enabled:= True;

Manfred

Thread programmieren
Hallo,

wenn du einen Thread (Programm im Programm) programmierst, solltet du damit kaum Probleme haben. Ein Thread fungiert als manueller Timer und ich ziehe diese dem VCL Timer vor.

Diese Funktion beendet sich automatisch nach 5 Durchgängen:

function Wiederholungsschleife(dwParam: DWORD): DWORD; stdcall;
var
 i: Integer;
begin
 Result := 0;
 i := 0;
 while true do begin
 if i \>= 5 then break; // nach 5 durchgängen abbrechen

 { dein text }

 if Form1.CheckBox1.Checked then Sleep(300) // Wenn Checkbox aktiv, dann 300ms warten

 Inc(i); // Durchgänge zählen
 end;
end;

Aufgerufen wird die Funktion mit

var
 dwThread: DWORD;

CloseHandle(CreateThread(nil, 0, @wiederholungsschleife, nil, NORMAL\_PRIORITY\_CLASS, dwThread));

MFG
der Chris