起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 158|回复: 8

【结贴】停止线程问题**

[复制链接]
发表于 2008-11-21 10:55:33 | 显示全部楼层 |阅读模式
我在线程执行里写了一个大循环(比较耗时间、但耗资源不大),然后没让线程执行完毕我就关闭功能窗体,在功能窗体的BizFormDestroy里让线程停止lThread.Terminate。但是这样会报错:
"List index out of bounds (1)”  和 "System Error.  Code: 299.
仅完成部分的 ReadProcessMemoty 或 WriteProcessMemory 请求"。
意思应该是线程还未执行完毕,难道线程的Terminate不管用?我又加了一句lThread.Free,这样就不报错了,但是程序执行Free之后很长时间也不结束。所以我怀疑线程的Terminate和Free都不能结束线程。
回复

使用道具 举报

发表于 2008-11-21 11:40:04 | 显示全部楼层
楼主,delphi中使用线程是这样的:
如果使用   TThread   类,不可能立即中止线程。使用   Terminate   方法只是设置线程类里面的一个   Terminated   标志。要想快点结束线程,要在   Execute   函数里面多加对   Terminated   标志的判断。如果非要立即结束线程,就不能使用   TThread   类,改成使用   windows   的   api   直接操作线程,使用   CreateThread,   ExitThread.
回复 支持 反对

使用道具 举报

发表于 2008-11-21 11:47:30 | 显示全部楼层
当线程执行完就Free了。   
  要想结束线程,可以用TThread.Terminate;   
  但是TThread.Terminate只是把TThread.Terminated赋为true,所以必须在Execute函数里加上检测Terminated的语句。   
  还有个办法强制结束线程——API函数TerminateThread,但是资源释放不了,最好别用。
回复 支持 反对

使用道具 举报

发表于 2008-11-21 11:48:26 | 显示全部楼层
procedure TMyClientThread.Execute;

var
  TheStream: TWinSocketStream;
  buffer: string;
begin
  { create a TWinSocketStream for reading and writing }
  TheStream := TWinSocketStream.Create(ClientSocket1.Socket, 60000);
  try
    { fetch and process commands until the connection or thread is terminated }
    while (not Terminated) and (ClientSocket1.Active) do
    begin
      try
        GetNextRequest(buffer); { GetNextRequest must be a thread-safe method }

        { write the request to the server }
        TheStream.Write(buffer, Length(buffer) + 1);
        { continue the communication (eg read a response from the server) }
        ...
      except
        ifnot(ExceptObject is EAbort) then
          Synchronize(HandleThreadException); { you must write HandleThreadException }
      end;
    end;
  finally
   TheStream.Free;
  end;
end;
---Execute函数里加上检测Terminated的语句的例子
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-11-21 13:32:10 | 显示全部楼层
谢谢二位详细的解答。能不能再教我API直接操作线程的方法(CreateThread、ExitThread、TerminateThread,主要是方法里面的参数不会用)?
回复 支持 反对

使用道具 举报

发表于 2008-11-21 13:35:47 | 显示全部楼层
百度一下吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-11-21 14:11:56 | 显示全部楼层
Borland.Delphi.Windows.TerminateThread(lThread.Handle,0) 这样就行了
回复 支持 反对

使用道具 举报

发表于 2008-11-21 14:29:16 | 显示全部楼层
那就结贴了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-11-21 15:14:55 | 显示全部楼层
嗯,结贴吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-27 15:11 , Processed in 0.055963 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表