如何正常退出线程?(高手请进)(20分)

  • 主题发起人 主题发起人 6ysnow
  • 开始时间 开始时间
6

6ysnow

Unregistered / Unconfirmed
GUEST, unregistred user!
在下是这样:
一个线程需要间隔10分钟访问一次数据库,于是我在线程中Sleep(10*1000*60)
可是问题是,我系统退出时我想Free线程,结果等10分钟!!!
我想问,我这种需求,如何快速退出线程?或者有更好的方法??
谢谢 !!!!!
 
可以强制中断线程呀!
 
不清除如何强制中断啊!!!
Terminated??
 
等待的时候不要时使用Sleep函数
可以设置一个事件内核对象
如果这个事件有信号了就接着执行
如果没有
则每隔10分钟超时一次
退出的时候将事件设置为有信号
在线程内WaitForSingleObject返回后判断一下原因
就可以了
 
不清除如何强制中断啊!!!
Terminated??
 
Mike1234567890说得对
using syncobjs
申请一个全局变量Event:TSimpleEvent
等待使用
Event.Waitfor(10*1000*60)
if Self.Terminated then
break;
退出可以使用
Thread.Terminate;
Event.SetEvent;
Thread.WaitFor;
Thread.Free;
 
这个论坛上以前已经有过了,关于结束线程的文章。对于需要循环执行线程的程序里面,
不要使用sleep函数,因为当你结束主程序的时候,你的线程一直处于sleep状态,这样导致主线程也跟着等待了,从而不能迅速的结束线程。而且还会导致资源不能释放的错误。所以推荐使用waitforsingleobject函数来做,也就是采用事件的方式,具体的做法查一下已经结束的帖子里面,保证能够正常的运行。
 
谢谢!◎
我自己有一个方式:
while not Terminated and not G_Thread_Exitdo
begin
FInteval:=GetTickCount()-G_Interval;
if FInteval>=FInterval then
//50秒
begin
do
someThing。。。。 ;
G_Interval:=0;
G_Interval:=GetTickCount();
end;
Application.ProcessMessages;
//保证资源的合理应用。
sleep(1);
end;
不知道我这样做是不是很合理!!!
 
不用循环调用application这句吧,你这句调用了主线程了,没有必要吧。还有线程里面尽量少用sleep
 
你这句调用了主线程了??application是将消息循环到主窗体,应该效果更好一些吧
 
主线程会自动负责的,不用你做
 
用TTimer更简单
 
其实不sleep的话,cup会很高,所以sleep(1)还是有必要的啊!!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
835
SUNSTONE的Delphi笔记
S
S
回复
0
查看
765
SUNSTONE的Delphi笔记
S
后退
顶部