Loops 我的程序在执行循环时变得无响应(Lazarus)
我写了一个简单的图形程序。它似乎可以工作,但当我单击按钮(按钮1)时,程序变得无响应,只有在指定的过程结束时才开始响应。我用的是简单的重复…直到循环。 程序如下:Loops 我的程序在执行循环时变得无响应(Lazarus),loops,pascal,repeat,lazarus,unresponsive-progressbar,Loops,Pascal,Repeat,Lazarus,Unresponsive Progressbar,我写了一个简单的图形程序。它似乎可以工作,但当我单击按钮(按钮1)时,程序变得无响应,只有在指定的过程结束时才开始响应。我用的是简单的重复…直到循环。 程序如下: procedure TSlashForm.Button1Click(Sender: TObject); begin Repeat //some code until //some condition; end; 如果在循环执行过程中单击表单,整个程序将失去响应并崩溃。为了解决这个问题,我尝试使用 SlashForm.Upd
procedure TSlashForm.Button1Click(Sender: TObject);
begin
Repeat
//some code
until //some condition;
end;
如果在循环执行过程中单击表单,整个程序将失去响应并崩溃。为了解决这个问题,我尝试使用
SlashForm.Update;
及
但这些似乎都不起作用。如何避免无响应状态?或每隔100-1000次左右调用循环中的application.processmessages。(如果迭代速度较慢,大约每秒5-10次)或每隔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;
有关工作示例,请参阅。您也可以使用多线程。在此变体中,程序通过创建执行循环的线程来响应单击按钮:
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;
有关工作示例,请参阅。如果您创建了一个应用程序,并且当用户按下按钮时,该应用程序开始处理一个大作业。。。在处理过程中,屏幕停止响应,并给用户留下应用程序已冻结的印象,将产生不良或误导性的印象。-文章引文。阅读它,了解有关您的问题和可能的解决方案的更多信息。如果您创建了一个应用程序,当用户按下一个按钮时,该应用程序开始处理一个大作业。。。在处理过程中,屏幕停止响应,并给用户留下应用程序已冻结的印象,将产生不良或误导性的印象。-文章引文。阅读它,了解有关您的问题和可能的解决方案的更多信息。请小心处理ProcessMessages,当人们不想通过线程的努力时,这是一种快速修复方法,但它也有自己的问题:在不理解ProcessMessages的情况下,决不能使用它,但是它本身并不是一个真正的问题。小心处理ProcessMessages,当人们不想经历线程的努力时,这是一个快速的解决方法,但它也有自己的问题:ProcessMessages在使用时不应该不理解它,但它本身并不是一个真正的问题。