我的程序在执行循环时变得没有响应 (Lazarus)

My program becomes unresponsive while performing a loop (Lazarus)

我写了一个简单的图形程序。它似乎有效,但是当我单击按钮 (Button1) 时,程序变得没有响应,并且仅在分配的过程结束时才开始响应。我使用的是简单的 Repeat...Until 循环。 程序如下:

procedure TSlashForm.Button1Click(Sender: TObject);
begin
 Repeat
  //some code
 until //some condition;
end; 

如果我在循环执行期间单击表单,整个程序将变得无响应并崩溃。为了解决这个问题,我尝试使用

SlashForm.Update;

SlashForm.Refresh;

但其中 none 似乎有效。如何避免无响应状态?

或者每 100-1000 次迭代左右在循环中调用 application.processmessages。 (如果迭代速度慢,大约每秒 5-10 次)

您也可以使用多线程。在此变体中,您的程序通过创建执行循环的线程来响应单击按钮:

type
  TAThread = class(TThread)
  public
    procedure Execute; override;
    procedure SafeFree;
  end;

theThread: TAThread;

procedure TAThread.Execute;
var
  //some variables
begin
  repeat
  // some code
  until // some condition
end;

procedure TSimulationThread.SafeFree;  {avoids a dead-lock situation}
begin
  Terminate;
  WaitFor;
  if not FreeOnTerminate then
    Free;
end;

procedure TSlashForm.Button1Click(Sender: TObject);
begin
  if assigned(theThread) then
    theThread.Execute
  else
    theThread := TAThread.Create(false);
end;

有关工作示例,请参阅 http://sourceforge.net/p/simthyr/code/HEAD/tree/trunk/simulator.pas