True ist immer wahr, eine while True do ... Schleife ist somit eine 'Endlosschleife' da die Abbruchbedingung nie False wird
Danke, ich habe Schleifen bis jetzt nie so eingesetzt. Das bedeutet also das selbst bei einem Fehler in der inneren Schleife die "while true do" immer weiter läuft und läuft und läuft... also der Versucht sich permanent zu Connecten, gut zu Wissen!
Ginge es so eventuell?
Delphi-Quellcode:
procedure TProducerLoop.Run;
begin
while True
do
begin
if not IsConnected
then Connect;
while IsConnected
do
begin
try
ProduceOneMessage;
except
on E:
Exception do
begin
Break;
// hier fehler oder auch nicht, schau mal.
end;
end;
end;
if IsConnected
then Disconnect;
end;
end;
Danke, aber das ist nicht erforderlich: die Connect-Methode sieht so aus:
Delphi-Quellcode:
procedure TProducerLoop.Connect;
begin
while True
do
try
CreateProducer;
Logger.Info('
Connected %d', [GetCurrentThreadID]);
IsConnected := True;
Exit;
except
on E:
Exception do
begin
Sleep(1000);
end;
end;
end;
Die ursprüngliche Version - ohne IsConnected - ist aber völlig ausreichend. Den langen Umweg über IsConnected habe ich nur verwendet um das "Break" als Ursache des APPCRASH auszuschliessen. Der Code mit
Break benötigt keine weitere Variable für den Abbruch der Schleife, ist funktional identisch, und leichter lesbar:
Delphi-Quellcode:
procedure TProducerLoop.Run;
begin
while True
do
begin
Connect;
while True
do
begin
try
ProduceOneMessage;
except
on E:
Exception do
begin
Break;
end;
end;
end;
Disconnect;
end;
end;