Results 1 to 10 of 10

Thread: Loop onderbreken

  1. #1

    Loop onderbreken

    Beste,
    Graag een tip hoe ik een bestaande loop kan onderbreken door op een knop te drukken.
    Ik programmeer soms simulaties die na een half uur resultaat geven.
    Hoe kan ik nu zo'n simulatie onderbreken door op een 'soort reset' knop te drukken. (In die simulatie zitten verschillende geneste for-loops)
    Nu sluit ik het programma af en start het opnieuw maar dit moet eleganter kunnen.
    Graag jullie tips aub.
    Vriendelijke groet,
    Paul

  2. #2
    Als je de loops zelf niet aan kunt passen met breaks op conditie o.i.d. dan is het killen van het process of thread de enige optie.

    En anders bouw je dus wel die condities in in de loop.

  3. #3
    Dag Rik,
    Heb je misschien toevallig zo'n een mini-voorbeeldje met zo'n break ingebouwd ?
    Vriendelijke groet, Paul

  4. #4
    Hangt van de loop af.
    Zijn het for, while of repeat loops.

  5. #5
    Het zijn for loops

  6. #6
    Dan heb je twee opties. Break of Goto.
    Break breekt alleen uit de huidige loop.
    Goto kan uit nested loops breken hoewel mijn voorkeur zich uit zou gaan naar break.

    Delphi Code:
    1. for i:= 1 to 10000 do
    2. begin
    3.   for j := 1 to 10000 do
    4.   begin
    5.     //...
    6.     if breakbuttonpressed then break;
    7.   end;
    8.   if breakbuttonpressed then break;
    9. end;

    Je moet dan wel buiten je eigen form of thread de breakbuttonpressed op true zetten.

    (Met langlopende simulaties is het overigens toch het beste om met threads te werken. Je kunt dan ook de boolean Terminated gebruiken in je loops.)

  7. #7
    Dag,
    Dank voor de info. Maar ik ben er niet uit geraakt met die "breakknop" op een extra form (form2) te zetten.
    Eens dat die for-loop loopt kan ik niet meer drukken op die breakknop. In begin van die loop zet ik die focus op die form2. Maar dat help niet.
    Ik zal eens het gebruik van die thread's moeten gaan bestuderen.
    Vriendelijke groet,
    Paul

  8. #8
    Dat komt omdat alle forms gewoon in de main thread zitten. En als je dan een loop maakt blokkeert dat de hele boel.

    Als alternatief kun je nog wel Application.ProcessMessages uitvoeren in de loop. Dan werkt zelfs een knop op hetzelfde form. Maar als het een tight-loop is kun je daar wel het beste maar een keer in de zoveel iteraties of tijd uitvoeren.

    Zoiets:
    Delphi Code:
    1. var
    2.   NextTime: UInt64;
    3.   I, J: Integer;
    4. begin
    5.   NextTime := GetTickCount64 + 2000; // 2000 = 2 seconden
    6.   for i:= 1 to 10000 do
    7.   begin
    8.     for j := 1 to 10000 do
    9.     begin
    10.       //...
    11.  
    12.       if GetTickCount64 >= NextTime then
    13.       begin
    14.         // dit geeft het programma de tijd om de messaging queue af te handelen
    15.         // en dus een buttonclick uit te voeren waar breakbuttonpressed gezet wordt
    16.         Application.ProcessMessages;
    17.         NextTime := GetTickCount64 + 2000; // 2000 = 2 seconden
    18.       end;
    19.  
    20.       if breakbuttonpressed then break;
    21.     end;
    22.     if breakbuttonpressed then break;
    23.   end;
    24. end;

    Maar zoals ik al eerder zei... als het echt gaat om langlopende simulaties en procedures, dan is het beste om dat in threads te doen. Maar bovenstaand is even een quick and dirty manier om het werkend te krijgen in één form zonder threads.

  9. #9
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    (gettickcount64 vreet mogelijk ook nog cpu, een extra ((j and 1023)=0) lost dat op)

  10. #10
    Het zal uiteindelijk langs die threads moeten gebeuren. Bovenstaand systeem lukt bij mij niet.
    Gelukkig is dit niet dringend en ga ik dit later terug opnemen.
    Dank voor de tips,
    Paul

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •