关于多线程的问题(200分)

  • 主题发起人 主题发起人 bzb
  • 开始时间 开始时间
B

bzb

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在后台做一个线程,让它每隔一秒自动触发一次,完成任务后自动挂
起,也就是要在线程里设时钟,当然并不能靠前台时钟去触发,因为前台
的时钟只要任务一繁忙就会不准。不能保证每一秒准时触发。请各位高手
不吝赐教,如能email我,更是感激不尽。多谢!
我的email:bzb@163.net
请予以详细的解释或demo。
 
WaitableTimer,是Win3API的内容.
 
你的问题不一定要用线程,请看PeekMessage、timeGetTime函数
的用途,在Delay执行时,其他程序一样执行。
Function Delay(DelayTimes:LongInt):Boolean;
Var
Msg:TMsg;
begin
DelayTimes:=timeGetTime+DelayTimes;
While DelayTimes>timeGetTimedo
begin
if PeekMessage(Msg,0,0,0,PM_REMOVE) then
begin
if Msg.Message<>WM_KeyDown then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
End
else
if Msg.Message=WM_KEYDOWN then
begin
if Msg.wParam=27 then
begin
Result:=True;
Exit;
End
else
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
end;
end;
if PeekMessage(Msg,Form1.Handle,0,0,PM_REMOVE) then
begin
if Msg.wParam=27 then
begin
Result:=True;
Exit;
end;
end;
Result:=False;
end;

 
如果对时间间隔的精度要求不高的话,可以用Sleep啊
procedure Execute;
begin
while not terminateddo
begin
...//do your work
Sleep(1000);//wait for 1 second
end;
end;
 
如果时间很关键的话, 把线程的优先级设为最高的.
 
看看关于线程的D4例子,如果要求不高,不必非用线程,用timer也能完成你的要求
 
TK128和Tqz的方法都是使用延时,这样延时的1秒钟加上处理事件的时间将
大于1秒钟,并非一秒(尤其是处理时间的时间较多如0.9秒,那么是1.9秒处理
一次了)。
下面给出的定时与事件处理时间无关(但事件处理时间必须小于1秒,否则就不是
1秒钟一次了)
uses MMSystem, synobjs;
type
TMyThread=class(TThread)
private
FTimerEvent:TSimpleEvent;
procedure YourWork;
protected
procedure Execute;override;
end;
procedure TimerCallback( uTimerID, uMessage: UINT;
dwUser, dw1, dw2: DWORD );
stdcall;
begin
with TMyThread(dwUser)do
if not Suspended and Assigned(FTimerEvent) then
FTimerEvent.SetEvent;
end;

procedure TMyThread.Execute;
var
FTimer:DWord;
FTimerEvent:TSimpleEvent;
lpTimerProc: TFNTimeCallBack;
begin
FOwner.FActionFinished:=False;
FTimerEvent:=TSimpleEvent.Create;
lpTimerProc := @TimerCallback;
FTimer := timeSetEvent(1000, 1000, lpTimerProc, DWORD(Self), TIME_PERIODIC );//创建多媒体定时器,1秒种
while not Terminateddo
begin
YourWork;//你的一秒钟一次的工作
FTimerEvent.WaitFor(1500);
FTimerEvent.ResetEvent;
end;
timeKillEvent( FTimer );
FTimerEvent.Free;
end;
 
多人接受答案了。
 
后退
顶部