不中断cpu工作,实现毫秒级的延时操作,如何处理?(200分)

  • 主题发起人 主题发起人 flyupwards
  • 开始时间 开始时间
F

flyupwards

Unregistered / Unconfirmed
GUEST, unregistred user!
本人开发串口通讯,希望不中断cpu的工作,而做出延时处理,故未选用sleep,
并采用了多线程,其中,延时时间为300ms,将延时操作转换为一个循环变量的最大值,以便对不同cpu周期的微机都能适应。

但存在下述问题:

一是,延时处理的类函数每次据300ms求得的变量数不定,有时6600,有时15000,形如此类

类源码:
unit gSThread;

interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
Type
SThread = class(TThread)
Public
ifstop:boolean;
MaxWaitTime:Longint;
procedure Execute; override;

private
{ Private declarations }
protected
End;
implementation

{ SampleThread }

procedure SThread.Execute;
var
FirstTickCount, Now: Longint;
MaxNum,j:Longint;
begin
ifstop:=false;
j:=0;
MaxNum:=90000000;
FirstTickCount := GetTickCount;
MaxWaitTime:=9000000;
repeat
Application.ProcessMessages;
{ allowing access to other controls, etc. }
Now := GetTickCount;
j:=j+1;
if (Now - FirstTickCount >= 300) or(j>=MaxNum) or (Now < FirstTickCount) then
ifstop:=true;
until (Now - FirstTickCount >= 300) or(j>=MaxNum) or (Now < FirstTickCount);
MaxWaitTime:= j;
end;
end.

二是,延时的函数未达到延时的求,在数据传输时,因为时间不配,通讯不通讯读写数据。

主程序对延时函数的调用如下:var
gSThread1:SThread;
i:integer;
begin
gSThread1 := SThread.Create(False);
i:=0;
repeat
gSThread1.ifstop:=false;
gSThread1.Execute;
i:=i+1;
until (gSThread1.ifstop) or (i>=MaxWaitTime);
gSThread1.FreeOnTerminate := True;
end;
 
《Delphi深度历险》一书有较详细的介绍
 
//------------------------------------------------------------------------------
procedure Delay(lMilliSeconds: Dword);
var
MyEvent :Thandle;
begin
MyEvent := CreateEvent(nil,True,False,nil) ;
waitforSingleObject(MyEvent,lMilliSeconds);
CloseHandle(MyEvent);
end;
 
procedure MyDoevents;
var
s_msg:TMSG;
begin
while (PeekMessage(s_msg,0,0,0,1)) do
begin
TranslateMessage(s_msg);
DispatchMessage(s_msg);
end;
end;
procedure Delay(lMilliSeconds: Dword);
var i_now:Dword;
begin
i_now:=GetTickcount+i_msecone;
while GetTickcount<i_now do
MyDoevents;
end;
 
var MyEvent :Thandle;
...
MyEvent := CreateEvent(nil,Ture,False,nil) ;
waitforSingleObject(MyEvent,500);

这本来是Windows 32位编程多线程同步时用到的技术,
但用在这里绝妙!MyEvent事件永远不发生,WaiForSingleObject 永远返回WM_TIMEOUT.
它的另一好处是等待的500ms中,几乎不占用CPU时间,别的线程可干其他事情.
定时精度比我所知的其他方法都高
 
DreamTiger的方法可谓是一劳永逸!^_^
 
我觉得你的想法有问题,你的这个线程就是为了延时,为什么不能用sleep呢?
 
后退
顶部