小妹又有问题啦!如何中断一个无限循环的程序? ( 积分: 100 )

  • 主题发起人 主题发起人 彤心依旧
  • 开始时间 开始时间

彤心依旧

Unregistered / Unconfirmed
GUEST, unregistred user!
我的同一个窗体上有两个按钮,一个“开始”和一个“停止”
按“开始”执行如下无限循环代码
bool stop=true;//自己定义的变量,也可用其它变量替代,比如多线程的全局变量等
while(stop)
{
for(int i=0;i<10;i++)
{
for(int j=0;j<31;j++)
{}
}
}
一旦点击了“开始”按钮,程序就进入了一个无限循环状态,无法再进行其它操作。
现在我想点击“停止”按钮中止这个循环,该怎么办啊!用多线程行吗?能给个代码看看吗?
如果不采用单击“停止”按钮的方法,别的还有什么方法吗?
谢谢了!
 
while(stop)
{
for(int i=0;i<10;i++)
{
for(int j=0;j<31;j++)
{
ProcessMessage(...);
..............
}
}
}
 
while(stop)
{
for(int i=0;i<10;i++)
{
for(int j=0;j<31;j++)
{
Application.ProcessMessages;
}
}
}
 
这样的设计就是错误的.
 
一个全局变量, BooStop
在循环中判断该变量
Application.ProcessMessages;
//响应外界信息
if boostop = true then
break
点击停止按钮时,另boostop := True
 
break;就行了
[:D]
 
用线程做:
unit uTrdGetJobs;
interface
uses
Classes;
type
TCallBack=Procedure(if_print:boolean) of Object;
TGetJobs = class(TThread)
private
protected
FCallBack:TCallBack;
procedure GetJob();Virtual;Abstract;
procedure Execute;
override;
Public
constructor Create(ACallBack:TCallBack);
end;
TGetJobsNT=Class(TGetJobs)
Protected
procedure GetJob();Override;
end;

implementation
{ TrdGetJobs }
constructor TGetJobs.Create(ACallBack: TCallBack);
begin
FCallBack:=ACallBack;
FreeOnTerminate := True;
inherited Create(False);
end;

procedure TGetJobs.Execute;
begin
while not Terminateddo
begin
FCallBack(GetJob);
end;
end;

{ TGetJobsNT }
procedure TGetJobsNT.GetJob;
var
i,j:integer;
begin
while (stop)do
////stop 为外部变量,你用启动、关闭时对他赋值
begin
for(int i=0;i<10;i++)
begin
for(int j=0;j<31;j++)
begin
///
end;
end;
end;
end;

end.
 
多人接受答案了。
 
后退
顶部