大家帮忙看看,关于线程与等待的问题!帮忙解决! ( 积分: 50 )

  • 主题发起人 主题发起人 setking
  • 开始时间 开始时间
S

setking

Unregistered / Unconfirmed
GUEST, unregistred user!
一个TTIME控件的代码如下:
procedure TForm1.TimerDLTimer(Sender: TObject);
var
adotst:AdoThread;
adozstst:AdoZsThread;
begin
adotst:=AdoThread.Create(GetCurrentDir + '/AWS/' + lastf.Text);
adotst.Resume;
sleep(30000);
adozstst:=AdozsThread.Create('//172.22.42.5/data/');
adozstst.Resume;
end;

很简单,就是两个不同的线程,我想让第一个先做,30秒后第二个开始!!!!!
大家说我这样写有错吗?
但我运行中发现,有的时候是正常的,30秒后才开始第二个的!
但有的时候,第一个运行了一小部分,然后就等待30秒后才和第二个线程一起做下去,这究竟是怎么回事???
有没有办法让让第一个线程做完了才继续做第二个的呢?请帮忙!
 
一个TTIME控件的代码如下:
procedure TForm1.TimerDLTimer(Sender: TObject);
var
adotst:AdoThread;
adozstst:AdoZsThread;
begin
adotst:=AdoThread.Create(GetCurrentDir + '/AWS/' + lastf.Text);
adotst.Resume;
sleep(30000);
adozstst:=AdozsThread.Create('//172.22.42.5/data/');
adozstst.Resume;
end;

很简单,就是两个不同的线程,我想让第一个先做,30秒后第二个开始!!!!!
大家说我这样写有错吗?
但我运行中发现,有的时候是正常的,30秒后才开始第二个的!
但有的时候,第一个运行了一小部分,然后就等待30秒后才和第二个线程一起做下去,这究竟是怎么回事???
有没有办法让让第一个线程做完了才继续做第二个的呢?请帮忙!
 
使用sleep(3000)是不对的。
因为sleep是对系统资源具有独占性,在sleep期间不响应消息的,无论你想实现什么目的
都应该尽量不用。
一个比较常用的办法是用计时器和Event结合。
首先CreateEvent
在后启动的线程中WaitForObject
然后可以在主线程中启动计时,30秒后SetEvent
至于计时,那方法就有很多了,但记住不要用干扰消息循环的方法。
 
有代码吗?你说得挺对的~~
 
看看深度历险这本书,上面有这个,也可以使用waitforsingalobject,下午给你贴点源代码,我有这个东西!
 
waitforsingalobject怎么用?谢谢!
 
我下午给你贴一段代码吧,我现在在单位上班,代码在学校里面,等一下,你也可以查一下论坛上的,全文检索看看就可以了撒,嘿嘿
 
好的,谢谢!等你的代码~~~~~~~
 
现在给你代码了:
首先,waitforsingalobject是在mmsystem单元中,所以在uses里面加入这个单元,
然后是定时的问题了,在线程的execute中的var里面声明:
timerid:integer;
hscantimerevent:Thandle;
然后在处理代码部分,也就是execute的begin
和end之间写如下代码:
hscantimerevent := CreateEvent(nil, False, False, nil);
timerid := timesetevent(300*1000,0,TFNTimecallback(hscantimerevent),0,time_periodic or time_callback_event_set);
至于timesetevent中的参数,你自己查一下吧,第一个是毫秒级别的,我里面的300*1000也就是300秒的意思了,然后最后一个参数time_periodic是循环的意思,然后下来就是如下的代码了:
procedure threadName.execute;
var
timerid:integer;
hscantimerevent:Thandle;
begin
hscantimerevent := CreateEvent(nil, False, False, nil);
timerid := timesetevent(300*1000,0,TFNTimecallback
(hscantimerevent),0,time_periodic or time_callback_event_set);
while not terminateddo
begin
if waitforsingalobject(hscantimerevent,INFINITE)=wait_object_0 then
begin
//你要循环处理的东西
end;
end;
timekillevent(timerid);
CloseHandle(hscantimerevent);
end;
基本上就是上面这样了。顺便说一句,如果你单独使用waitforsingalobject这个来处理循环定时的问题,可以解决了,但是同时出现一个问题就是当你退出系统的时候,如果线程处于等待状态,那么会出错,所以我建议你使用waitformultipleobjects这个函数,这个属于多事件的,把定时循环作为一个事件,把退出作为一个事件,这样就可以保证顺利的运行,不会出错了。
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
692
import
I
I
回复
0
查看
763
import
I
后退
顶部