Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Endlosschleifen von Außerhalb abbrechen


HenryHux - Mo 11.10.10 09:48
Titel: Endlosschleifen von Außerhalb abbrechen
Hi,

ich habe in einem Programm eine repeat-Schleife, welche unter manchen Bedingungen zur Endlosschleife wird.
Schleifenbedingungen kann ich immoment nicht anders setzen, deswegen suche ich nach einer Möglichkeit das Programm zu beenden.
Benutze atm einen Button mit


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TMain.KillProcessClick(Sender: TObject);
begin
    close();
    application.terminate;
    halt(1);
end;


Weiß, ist nicht gerade ne gute Möglichkeit.
Denn wenn die Schleife zur Endlosschleife "mutiert" ist, hilft close() und application.terminate nichts.
Dann wird halt ausgeführt und der Speicher wird nicht mehr freigegeben...
Hat da vielleicht jemand eine bessere Möglichkeit?
Wie gesagt Schleifenvariablen kann ich atm nicht anders setzen.
Und was passiert eigentlich, wenn ich die Resourcen nicht wieder freigebe? Einfach als unbenutzter Speicher im RAM?

Lg

Herny


platzwart - Mo 11.10.10 09:53

Setze eine weitere Schleifenbedingung, z.B. weiterMachen: Boolean; Dann noch ein Application.ProcessMessages einfügen, das sorgt dafür, dass du die GUI weiterhin benutzen kannst (und somit einen Button drücken kannst).


Delphi-Quelltext
1:
2:
3:
4:
Repeat
 doSomething;
 Application.ProcessMessages;
Until (bisherigeBedingung and weiterMachen);


Und dann im OnClick des Buttons das weiterMachen auf false setzen...


JoelH - Mo 11.10.10 09:55

mach dir eine globale bool-Variable und setzt die bei deinem Killclick auf true. In der repeat schleife setzt du diese Variable als weitere endbedingung und kannst so relativ gut die Endlosschleife verlassen ohne gleich alles nieder zu reißen.

Edit: Platzwart war schneller.


HenryHux - Mo 11.10.10 10:02

Also ich post einfach mal die Schleife,

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  repeat
    image1:=0;
    image2:=0;
    image3:=0;
    image4:=0;
    readinimage1.Click;
    readinimage2.click;                    //Es wird solange geprüft, bis bestimmte Bilder aufgetaucht sind
    readinimage3.Click;
    readinimage4.Click;
    application.processmessages;
  until (image1>0and (imaged2>0and (image3>0and (image4>0);


Wenn ich bei until jetzt einfach noch ne Bedingung zusätzlich hinzufüge, bringt mir das hier nichts.
Oder habe ich euch/etwas falsch verstanden?

lg


jaenicke - Mo 11.10.10 10:09

Da wirst du wohl dein Konzept insgesamt korrigieren müssen...


HenryHux - Mo 11.10.10 10:11

Ok. Ich werd das Problem mal hinten anstellen und die gute alte Brechstange weiterhin benutzen :D

Lg


HenryHux - Mo 11.10.10 10:13

Update =)

Habe es einfach mit break gemacht:

Delphi-Quelltext
1:
    if weitermachen=false then break;                    

So klappt es ganz gut, und denke wird es auch weiterhin.

Danke lg


iKilledKenny - Mo 11.10.10 11:24

Besser wäre da wohl ein

Delphi-Quelltext
1:
2:
if not weitermachen then
  Break;