我的程序在执行循环时变得没有响应 (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。
我写了一个简单的图形程序。它似乎有效,但是当我单击按钮 (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。