Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 我的程序在执行循环时变得无响应(Lazarus)_Loops_Pascal_Repeat_Lazarus_Unresponsive Progressbar - Fatal编程技术网

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

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

我写了一个简单的图形程序。它似乎可以工作,但当我单击按钮(按钮1)时,程序变得无响应,只有在指定的过程结束时才开始响应。我用的是简单的重复…直到循环。 程序如下:

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在使用时不应该不理解它,但它本身并不是一个真正的问题。