C
cqwty
Unregistered / Unconfirmed
GUEST, unregistred user!
对于带定时器的线程(也就是间隔多少时间,做什么工作)的结束,在点击结束线程的按钮之后,总是需要等一个间隔时间左右,这时候,软件的界面处于死界面的状态,当然这种时间间隔的定时线程有很多实现方法,比如sleep,waitforsingleobject等。在陈宽达的深度历险中专门介绍一个章节的定时器使用。请教一下,如何快速结束这样的线程,而且保证资源得到释放。至于直接使用terminatethread这样的api就不用在此提出来了。因为释放不了资源,线程是结束了。
比如下面的代码:(只贴出execute部分)
1.使用sleep的;
var
precount,nextcount:dword;
begin
while not terminateddo
begin
preCount := GetTickCount();
Synchronize(sampledata);
nextCount := GetTickCount() - preCount;
if nextCount < FSampTime then
sleep(FSampTime - nextCount);
end;
end;
2.使用waitforsingleobject的;
var
timerid:integer;
htimerevent:Thandle;
begin
{ Place thread code here }
htimerevent := CreateEvent(nil, False, False, nil);
timerid := timesetevent(FSampTime,0,TFNTimecallback(htimerevent),0,time_periodic or time_callback_event_set);
while not terminateddo
begin
if waitforsingleobject(htimerevent,infinite) = wait_object_0 then
begin
sampledata;
end;
end;
timekillevent(timerid);
CloseHandle(htimerevent);
end;
请大家各抒己见吧。
比如下面的代码:(只贴出execute部分)
1.使用sleep的;
var
precount,nextcount:dword;
begin
while not terminateddo
begin
preCount := GetTickCount();
Synchronize(sampledata);
nextCount := GetTickCount() - preCount;
if nextCount < FSampTime then
sleep(FSampTime - nextCount);
end;
end;
2.使用waitforsingleobject的;
var
timerid:integer;
htimerevent:Thandle;
begin
{ Place thread code here }
htimerevent := CreateEvent(nil, False, False, nil);
timerid := timesetevent(FSampTime,0,TFNTimecallback(htimerevent),0,time_periodic or time_callback_event_set);
while not terminateddo
begin
if waitforsingleobject(htimerevent,infinite) = wait_object_0 then
begin
sampledata;
end;
end;
timekillevent(timerid);
CloseHandle(htimerevent);
end;
请大家各抒己见吧。