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

时间:2015-06-05 16:10:12

标签: loops pascal repeat lazarus unresponsive-progressbar

我写了一个简单的图形程序。它似乎工作,但是当我点击按钮(Button1)时,程序没有响应,只有在指定的程序结束时才开始响应。我正在使用简单的Repeat ... Until循环。 这是程序:

REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoDetect /t REG_DWORD /d 0 /f

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

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

SlashForm.Update;

但这些似乎都不起作用。我怎样才能避免无反应的状态呢?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

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