如何终止一个正在运行的过程?(50分)

  • 主题发起人 主题发起人 biyesheng
  • 开始时间 开始时间
B

biyesheng

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在一个过程序的运行过程中来能过点一个按钮来终止该过程的运行。
可是现在在过程的运行中程序不接受别的事件的触发,怎么办?
请问:有没有API函数能让程序在执行一个过程时能接受别的事件?
 
用线程,线程可以随时挂起
 
线程可以,不过如果不想用,可以试试下述方法:

设置一全局标志:如 exit_flag:boolean;
初始化为:exit_flag:=false;
在过程中判断: if exit_flag then 退出
在按钮的onclick中添加:exit_flag:=true;

不知道符合不符合你的意思。
 
to truecat:
我开始也是想这么做的,但是在那个过程的运行中跟本就不接受别的BUTTON的事件,
也就是说别的按键跟本就按不下去,怎么办呀??
 
过程中有循环语句吧?
如有,在循环体中加入下面一句。
application.ProcessMessages ;
 
请问加上application.ProcessMessages ;有什么用?
 
作用是释放CPU以便响应其它WINDOWS消息。你把过程代码贴上来,我给你看看。
 
过程代码不长但很复杂,就是说相关的代码很多,它实际上是一个自定义脚本的执行
过程,里面有循环,我试一下行不行。
 
我直接把“application.ProcessMessages ”贴到程序中去吗?
提示出错呀:[Error] Executor.pas(52): Undeclared identifier: 'Application'
不好意思,我知道很少,请指点
 
QQ:23555873,在线支持 8D
 
好像叫TerminateProcess
 
上QQ一谈。
 
天啊,我的电脑没装QQ,哪里有下载?
 
算了,你贴上过程代码,我帮你改好再贴上来,OK?
 
ok
过程来也
procedure Execute;
begin
VTable:=TVarTable.Create;
PC:=0;
SItem:=Script.Items[PC];
while SItem.Instruction<>CEND do
begin

// Application.ProcessMessages; 最好加在这里
case SItem.Instruction of
CMOV:
begin
if not WriteParameter(SItem.Parameter1,ReadParameter(SItem.Parameter2)) then exit;
inc(PC);
end;
CJMP:
begin
PC:=StrToInt(SItem.Parameter1);
end;
CADD:
begin
WriteParameter(SItem.Parameter1,AddFormattedByteString(ReadParameter(SItem.Parameter1),
ReadParameter(SItem.Parameter2)));
inc(PC);
end;
CSUB:
begin
WriteParameter(SItem.Parameter1,SubbFormattedByteString(ReadParameter(SItem.Parameter1),
ReadParameter(SItem.Parameter2)));
inc(PC);
end;
CINC:
begin
tmpS:=VTable.ReadVariable(SItem.Parameter1);
IncreaseFormattedByteString(tmpS);
VTable.WriteVariable(SItem.Parameter1,tmpS);
inc(PC);
end;
CDEC:
begin
tmpS:=VTable.ReadVariable(SItem.Parameter1);
DecreaseFormattedByteString(tmpS);
VTable.WriteVariable(SItem.Parameter1,tmpS);
inc(PC);
end;
CANL:
begin
end;
CORL:
begin
end;
CXRL:
begin
end;
CCALL:
begin
end;
CRET:
begin
end;
CDJNZ:
begin
tmpS:=VTable.ReadVariable(SItem.Parameter1);
DecreaseFormattedByteString(tmpS);
if isFormattedByteStringZero(tmpS)
then
inc(PC)
else
PC:=StrToInt(SItem.Parameter2);
end;
CDESEP:
begin
end;
CDESDP:
begin
end;
CMAC:
begin
end;
CTAC:
begin
end;
CRESET:
begin
Mainform.BtnReset.Click;
inc(PC);
end;
CGET:
begin
if not WriteParameter(SItem.Parameter1,GetForScript) then exit;
inc(PC);
end;
CSEND:
begin
tmpS:=ReadParameter(SItem.Parameter1);
if tmpS<>'' then
SendForScript(tmpS);
inc(PC);
end;
CWRITE:
begin
WriteForScript(SItem.Parameter1);
inc(PC);
end;
CERROR:
begin
end;
CMATCH:
begin
end;
end;
SItem:=Script.Items[PC];
end;
end;
 
就到这里吧,truecat的方法可能能行
 
不好,给分时没仔细看,让wolfsong占了便宜。truecat请到
http://delphibbs.com/delphibbs/dispq.asp?lid=1280634
 

procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
Cancel:=False;
for I:=1 to 9000000 do
begin
Application.ProcessMessages;
if Cancel then break;
Edit1.Text:=IntToStr(I);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Cancel:=True;
end;

cancel是全局布尔变量
 
后退
顶部