大家帮我看看这个线程,为什么不能结束阿,我刚学用线程不久(50分)

  • 主题发起人 主题发起人 netfire_fly
  • 开始时间 开始时间
N

netfire_fly

Unregistered / Unconfirmed
GUEST, unregistred user!
不好意思,我分不多,只能给这么多
procedure MultiSearchThread.Execute;
var multithread:TMainSearchThread;
//需要调用次级线程
i:integer;
begin
Form1.PFilelist.Cursor:=crHourGlass;
//for i:=0 to 5do
begin
MultiThread:=TmainSearchThread.Create(true);
MultiThread.FreeOnTerminate:=true;
MultiThread.Resume ;
if Terminated then
exit;
Form1.pFileList.cursor:=CrDefault;
end;
end;
还有一个次一级的线程 TMainSearchThread
procedure TmainSearchThread.Execute;
var LServer:TstringList;
LUsers:TstringList;
LUResource:TstringList;
n,i,j,k{,m}:integer;
WorkGroupCount,Usercount:Integer;
item:TListItem;
Tempuserstr:string;
SRFile:TSearchRec;
NetDir,TempDir:string;
FileAttr:integer;
curp:Tpoint;
searchers:array[0..50] of TSearchUserThread;
DevGroup:integer;
LeftGroup:integer;
begin
if Terminated=true then
exit;
begin
// TGroupList:=TstringList.Create ;
initializeCriticalSection(g_critical);
With Form1do
begin

pFilelist.Clear ;
try
Lserver:=TstringList.Create ;
LUsers:=TstringList.Create ;
LUResource:=TstringList.Create
//--------------------------------------------
do
something
//----------------------------------------------
finally
Lserver:=TstringList.Create ;
LUsers:=TstringList.Create ;
LUResource:=TstringList.Create;
Screen.cursor:=crDefault;
end;
//end try
end;
//end with
end;
//
end;
我的停止方法 //一点都不管用,无法中间终止线程,老是句柄无效.而且总是线程也无法终止
procedure TForm1.SpstopClick(Sender: TObject);
var Return:Dword;
begin

Searchf.Stop ;
spgo.Enabled :=true;
BitBtn1.Enabled:=true;
if MainThread=nil then
exit
else
begin
MainThread.Suspend;
TerminateThread(MainThread.Handle,Return);
MainThread.Free;
//MainThread.Terminate;
//MainThread.Free;
end;
end;
 
大家帮忙看看啊,急~~~~~~谢拉
 
线程不会马上中止(除非强制中止),你需要等待其中止。
也就是说调用TerminateThread后,线程并没有立即中止。
你要在线程中检测是否需要中止,如果是,则由线程主动中止。因此,在
//--------------------------------------------
do
something
//----------------------------------------------
中,你需要常常地检查TERMINATEED是否为TRUE,是则退出:
//--------------------------------------------
while not Terminateddo
begin
...
if Terminated then
Break;
...
end;
//----------------------------------------------
中止线程可简单写成以下方式:
procedure TForm1.SpstopClick(Sender: TObject);
var
Return: Dword;
begin
Searchf.Stop;
spgo.Enabled := true;
BitBtn1.Enabled := true;
if MainThread = nil then
exit
else
begin
//结束线程:
//通知线程终止
MainThread.Terminate;
//等待线程退出
while WaitForSingleObject(MainThread.Handle, 0) <> WAIT_OBJECT_0do
for J := 0 to 1000do
Application.ProcessMessages;
//如果不是FreeOnTerminate的,加上这一句
MainThread.Free;
end;
end;
 
另外等待用WAITFOR也可以,但DELPHI5中的WAITFOR可能会死锁,DELPHI6我没有完全测试。
 
谢了,有加深了我的理解.我去试试
 
对了,TerminateThread强制终止线程(线程会立即终止),是非常危险的函数,尽量不要用!
 
后退
顶部