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:
var
NextTime: UInt64;
I, J: Integer;
begin
NextTime := GetTickCount64 + 2000; // 2000 = 2 seconden
for i:= 1 to 10000 do
begin
for j := 1 to 10000 do
begin
//...
if GetTickCount64 >= NextTime then
begin
// dit geeft het programma de tijd om de messaging queue af te handelen
// en dus een buttonclick uit te voeren waar breakbuttonpressed gezet wordt
Application.ProcessMessages;
NextTime := GetTickCount64 + 2000; // 2000 = 2 seconden
end;
if breakbuttonpressed then break;
end;
if breakbuttonpressed then break;
end;
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.
Bookmarks