c++ builder如何产生频率为8000hz的定时操作

stray1718 2011-05-07 10:41:11
rt,谢谢
...全文
225 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
huzhangyou 2011-08-08
  • 打赏
  • 举报
回复
对于精确度要求更高的定时操作,则应该使用QueryPerformanceFrequency()和 QueryPerformanceCounter()函数。这两个函数是VC提供的仅供Windows 95及其后续版本使用的精确时间函数,并要求计算机从硬件上支持精确定时器。如示例工程中的Timer7、Timer7_1、Timer7_2、Timer7_3。
QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型如下:
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount);


参考
http://www.cppblog.com/xpzhou/archive/2007/04/20/22426.html
cankoo 2011-08-06
  • 打赏
  • 举报
回复
理论上可以!
rickys2080 2011-08-04
  • 打赏
  • 举报
回复
Timer控件最低精度好像是50ms
痞子酷 2011-07-25
  • 打赏
  • 举报
回复
struct timeval timeout ;
//struct timeval {
// int tv_sec; /* seconds */
// int tv_usec; /* microseconds */
//
FD_ZERO(&fdR);
FD_SET(fd1,&fdR);
select(fd1+1, &fdR, NULL, NULL,&timeout)
痞子酷 2011-07-25
  • 打赏
  • 举报
回复
采用线程和函数 select也许能精确到,但取决于电脑主频
fbmsyu 2011-07-25
  • 打赏
  • 举报
回复
不可能的。别费劲了。windows不支持
zz997788 2011-07-23
  • 打赏
  • 举报
回复
我觉得不是软件能实现的事,就丢给硬件去做,如果是单片机做应该没问题。
sterrys 2011-07-19
  • 打赏
  • 举报
回复
硬件中断
  • 打赏
  • 举报
回复
PC中,不用附加的硬件,基本上只有CMOS RTC中断(IRQ 8)可以达到这种要求,保证8K肯定没问题,大部分都可以到32K,某些RTC芯片,通过设置可以工作在4MHz的中断率。无论如何,得写ring 0级的驱动才行,用户模式的驱动应该不行。
LuoGD 2011-06-02
  • 打赏
  • 举报
回复
WINDOWS下实现不了,只是理论上可以!
My_Love 2011-05-30
  • 打赏
  • 举报
回复
在Windos下,如果驱动正在进行一些费时操作,别说1ms、55ms就是1s都不一定能保证。
Bosman 2011-05-30
  • 打赏
  • 举报
回复
HANDLE hTimer=CreateWaitableTimer(NULL,false,NULL);
LARGE_INTEGER liDueTime;
liDueTime.QuadPart=-10000000*LoginSecond;//1秒;
SetWaitableTimer(hTimer,&liDueTime,0,NULL,NULL,false);
while(!Terminated)
{
if (WaitForSingleObject(hTimer,1500)==WAIT_OBJECT_0)
{
if (Terminated||!ptrHttpProc[WebID]||ptrHttpProc[WebID]->pAccountLogin||ptrHttpProc[WebID]->HaveLogin)
break;
ptrHttpProc[WebID]->pReLogin=NULL;//login消息判断pRelogin,必须先置Null
PostThreadMessage(ptrHttpProc[WebID]->ThreadID,WM_LG_Login,0,0);
break;
}
}
CancelWaitableTimer(hTimer);
CloseHandle(hTimer);
土著巫师 2011-05-28
  • 打赏
  • 举报
回复
1毫秒震荡8次?!还是找实时操作系统吧,WINDOWS平台应该不可以达到这个实时性要求,之前在WIDNOWS平台上用SDK改过一个多媒体时钟用,你可以在网上找一下,但我以为也达不到你要求的精度。
xjq2003 2011-05-07
  • 打赏
  • 举报
回复
C++ Builder等都有专用的定时器控件Timer,而且使用很方便,可以实现一定的定时功能,但最小计时精度仅为55ms,且定时器消息在多任务操作系统中的优先级很低,不能得到及时响应,往往不能满足实时控制环境下的应用。不过Microsoft公司

在Win32 API函数库中已经为用户提供了一组用于高精度计时的底层函数,如果用户使用得当,计时精度可到1ms。这个计时精度、对于一般的实时系统控制完全可以满足要求。现将由C++ Builder 4.0提供的重新封装后的一组与时间相关的主要接口函数(函数名、参数、功能与Win32 API基本相同)说明如下:

  1.DWORD timeGetTime(void)
  返回从Windows启动开始经过的毫秒数。最大值为232,约49.71
天。
  2.MMRESULT timeSetEvent(
  UINT uDelay,
  UINT uResolution,
  LPTIMECALLBACK lpTimeProc,
  DWORD dwUser,
  UINT fuEvent
   )

  该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事件。事件一旦被激活,便调用指定的回调函数,成功后返回事件的标识符代码,否则返回NULL。参数说明如下:

  uDelay:以毫秒指定事件的周期。
  UResolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms。
  LpTimeProc:指向一个回调函数。
  DwUser:存放用户提供的回调数据。
  FuEvent:指定定时器事件类型:
  TIME_ONESHOT:uDelay毫秒后只产生一次事件
  TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件。

  3.MMRESULT timeKillEvent(UINT uTimerID)
  该函数取消一个指定的定时器回调事件。uTimerID标识要取消的事件(由timeSetEvent函数返回的标识符)。如果成功则返回TIMERR_NOERROR

,如果定时器时间不存在则返回MMSYSERR_INVALPARAM。
  void CALLBACK TimeProc(
  UINT uID,
  UINT uMsg,
  DWORD dwUser,
  DWORD dw1,
  DWORD dw2
   );

  该函数是一个应用程序定义的回调函数,出现定时器事件时该函数被调用。TimeProc是应用程序定义的函数名的占位符。使用该函数时要注意

的是,它只能调用以下有限的几组API函数:PostMessage,timeGetSystemTime, timeGetTime, timeSetEvent,timeKillEvent,midiOutShortMsg, midiOutLongMsg,OutputDebugString。同时也不要使用完成时间很长的API函数,程序尽可能简短。

  使用以上一组函数就可以完成毫秒级精度的计时和控制(在C++Builder中使用时要将头文件mmsystem.h加到程序中)。由于将定时控制精确到几毫秒,定时器事件将占用大量的CPU时间和系统资源,所以在满足控制要求的前提下,应尽量将参数uResolution的数值增大。而且定时器实时控制功能完成后要尽快释放
本文来自: 中科软件园(www.4oa.com) 详细出处参考:http://www.4oa.com/Article/html/6/33/487/2005/17557.html
xjq2003 2011-05-07
  • 打赏
  • 举报
回复
使用线程,延时
weidp2004 2011-05-07
  • 打赏
  • 举报
回复
创建一个线程,建立一个死循环,然后启用微秒级计时,检测到微秒到达时触发事件!详细代码以后提供
stray1718 2011-05-07
  • 打赏
  • 举报
回复
timesetevent只能精确到1ms,最大频率也就到1000hz,不能满足要求啊

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧