收集精确定时器masterz快来回答啊

时间:2022-10-23 16:23:00
收集精确定时器,除了以下的方法
1.       CreateWaitableTimer,SetWaitableTimer,优点是精确度为100n秒,计时满后调用指定的回调函

数,所以系统占用率非常低,缺点是能够记得最短时间是10毫秒,
2        LARGE_INTEGER lCnt1,lFr,lCnt2;
     double f1,f2,fTime;
           QueryPerformanceCounter(&lCnt1);      //起始记时

        。。。。。

QueryPerformanceCounter(&lCnt2);
QueryPerformanceFrequency(&lFr);      //得到计数器的频率
f1=lCnt2.QuadPart-lCnt1.QuadPart;
f2=lFr.QuadPart;
fTime=(double)(f1/f2); //fTime就是所用的时间
缺点是:因为是要循环查询方式,所已精确定时时,资源占用达到100%,系统停顿,
3    多媒体计时器 
        缺点是精确度不高,只有1毫秒,能够记得最短时间也不高,为1毫秒,

4操作8253,缺点是到读写端口,非常麻烦,好像也是循环查询方式,


我想寻找一种像SetWaitableTimer. 多媒体计时器那样计时结束后调用指定回调函数的方式,
又能像方法2那样即能够记得很短时间,又能得到很高的精确度的计时器。

大家多帮助啊

38 个解决方案

#1


说实话大家都在找。就是找不到。Windows这种系统实时性不好,还是用单片机比较好。

#2


没人吗

#3


up

#4


多任务操作系统定时不可能太精确。

用单片机不一定非得查询端口,可以采用高优先级中断的方式,当然,这可能需要写一个驱动程序。

#5


我顶

#6


http://expert.csdn.net/Expert/topic/1313/1313387.xml?temp=.8180048

#7


to demetry(大松)
早看过

#8


学习

#9


windows毕竟是一个用于上网,玩游戏,文档处理,看电影,听音乐的操作系统。
你能对它指望什么呢?

#10


各位有人用过ASM的晶振吗?

_asm(nop);

它的精度可是很高的呦;

不过不太好用!

各位可以研究研究


#11


写驱动程序试试,我作过一个VXD,截获CMOS定时器时钟中断,精度1ms,
如果用外部定时器,应该可以做得更高的

#12


to zhouwenjie(小周)
如果我记得没错的话,CMOS定时器时钟中断好像定时间隔最多只能到18.4毫秒

#13


操作8254用是断方式,可以达到1微秒,不过一般20微秒以下Windows本身就不行了

#14


to AthlonxpX86(一滴水):
最小分辨率应该可以达到1ms的,
如果要到微秒级的话,我想只有在驱动里做采集了

#15


to Areslee(易水)
谢谢你的回复,我不想用8253/8254的方法,因为这是为windows准备的,你见过变速齿轮吗,他就是修改个8253的中断时间,我想用计时器,但也不想改变windows的系统计时器啊,这样以来我就只能查询方式用8253,虽然能得到840ns的时间间隔,但效率很低啊,弄不好系统占用就达到100%,用查询方式,我有更先进的计时器,甚至可以达到0.5ns(2GHz CPU),其实windows有
100ns时间间隔的定时器,但给我们用时就吝啬到毫秒级了,其实我的要求不高,能达到10微秒的时间间隔,100ns的精度就行了,

#16


http://expert.csdn.net/Expert/topic/1313/1313387.xml?temp=.2552149

#17


to dxhdxh2k(dxhdxh)
你的那些方法我都知道,所以才开的这张贴

#18


既然要精确定时,就不该采用多任务操作系统,更不应该在意CPU资源使用率。

#19


to wabc(wabc)
CPU资源使用率高无所谓,只要系统慢的不要像死机就可以了。
我用以下方法后,虽然是我认为最好的计时器,用了之后,既使你计的时间是1秒,资源占用率也是100%,这个无所谓,但win2000系就像死机了一样,所有应用程序将停止响应,我用Ctrl+Alt+Delete打开任务管理器,可打开它却用了2分钟,我调整计时线程的优先级也不管用,但我若在循环中加入Sleep(1)
后,即使打开100个计时线程,cpu占用率也不会达到100%。
for(.....)
{
LARGE_INTEGER lCnt1,lFr,lCnt2;
     double f1,f2,fTime;
           QueryPerformanceCounter(&lCnt1);      //起始记时

        。。。。。

QueryPerformanceCounter(&lCnt2);
QueryPerformanceFrequency(&lFr);      //得到计数器的频率
f1=lCnt2.QuadPart-lCnt1.QuadPart;
f2=lFr.QuadPart;
fTime=(double)(f1/f2); //fTime就是所用的时间
}
.........

#20


gz

#21


我顶

#22


但是加入Sleep(1)就会影响精度了。

#23


坚决不用sleep(1)

用 SwitchToThread()

#24


to mostneed(现在是兼职称畜员) 
SwitchToThread()怎么用

#25


SwitchToThread()相当于一个Sleep(0)。将cpu交给其他线程

::Quote MSDN::

SwitchToThread
The SwitchToThread function causes the calling thread to yield execution to another thread that is ready to run on the current processor. The operating system selects the thread to yield to.

BOOL SwitchToThread(VOID);

#26


SwitchToThread unsupport win95/98

#27


学习!

#28


to mostneed(现在是兼职称畜员) 
为什么我调用SwitchToThread();编译出错
F:\portio1\rw\rwDlg.cpp(342) : error C2039: 'SwitchToThread' : is not a member of '`global namespace''
F:\portio1\rw\rwDlg.cpp(342) : error C2065: 'SwitchToThread' : undeclared identifier

#29


不支持win9x

==:quote: msdn ==

Requirements 
  Windows NT/2000/XP: Included in Windows NT 4.0 and later.
  Windows 95/98/Me: Unsupported.
  Header: Declared in Winbase.h; include Windows.h.
  Library: Use Kernel32.lib.

#30


to mostneed(现在是兼职称畜员)
我从不用98,我的操作系统是2000

#31


加上上述的头文件和连接库,也是一样

#32


你看看winbase.h

WINBASEAPI
BOOL
WINAPI
SwitchToThread(
    VOID
    );
#endif /* _WIN32_WINNT >= 0x0400 */

要求  _WIN32_WINNT >= 0x400

所以在 stdafx.h 头部加入:
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif

在vc7下编译不需要,我刚才换到vc6下也出问题了。

#33


::O

关注

#34


guanzhu

#35


问题基本解决,我用下面代码做了个方波振荡器,频率可以上去(我只试了50KHz计时间隔10us,但波形不好,容易受影响,可能是多线程的通病)可能是我现在能达到的最好的计时器了(基本达到要求)
for(.....)
{
LARGE_INTEGER lCnt1,lFr,lCnt2;
     double f1,f2,fTime;
           QueryPerformanceCounter(&lCnt1);      //起始记时

        。。。。。

QueryPerformanceCounter(&lCnt2);
QueryPerformanceFrequency(&lFr);      //得到计数器的频率
f1=lCnt2.QuadPart-lCnt1.QuadPart;
f2=lFr.QuadPart;
fTime=(double)(f1/f2); //fTime就是所用的时间
         SwitchToThread();//防止线程占用100%的资源

}
.........
另外,QueryPerformanceCounter();的速度实在不敢恭维,我想用汇编代码代替,为其加速,谁有他的汇编代码啊?

#36


实在不会,帮你up 一下,数据库还懂一点了。

#37


GetTickerCount()如何呢?

#38


Mark

#1


说实话大家都在找。就是找不到。Windows这种系统实时性不好,还是用单片机比较好。

#2


没人吗

#3


up

#4


多任务操作系统定时不可能太精确。

用单片机不一定非得查询端口,可以采用高优先级中断的方式,当然,这可能需要写一个驱动程序。

#5


我顶

#6


http://expert.csdn.net/Expert/topic/1313/1313387.xml?temp=.8180048

#7


to demetry(大松)
早看过

#8


学习

#9


windows毕竟是一个用于上网,玩游戏,文档处理,看电影,听音乐的操作系统。
你能对它指望什么呢?

#10


各位有人用过ASM的晶振吗?

_asm(nop);

它的精度可是很高的呦;

不过不太好用!

各位可以研究研究


#11


写驱动程序试试,我作过一个VXD,截获CMOS定时器时钟中断,精度1ms,
如果用外部定时器,应该可以做得更高的

#12


to zhouwenjie(小周)
如果我记得没错的话,CMOS定时器时钟中断好像定时间隔最多只能到18.4毫秒

#13


操作8254用是断方式,可以达到1微秒,不过一般20微秒以下Windows本身就不行了

#14


to AthlonxpX86(一滴水):
最小分辨率应该可以达到1ms的,
如果要到微秒级的话,我想只有在驱动里做采集了

#15


to Areslee(易水)
谢谢你的回复,我不想用8253/8254的方法,因为这是为windows准备的,你见过变速齿轮吗,他就是修改个8253的中断时间,我想用计时器,但也不想改变windows的系统计时器啊,这样以来我就只能查询方式用8253,虽然能得到840ns的时间间隔,但效率很低啊,弄不好系统占用就达到100%,用查询方式,我有更先进的计时器,甚至可以达到0.5ns(2GHz CPU),其实windows有
100ns时间间隔的定时器,但给我们用时就吝啬到毫秒级了,其实我的要求不高,能达到10微秒的时间间隔,100ns的精度就行了,

#16


http://expert.csdn.net/Expert/topic/1313/1313387.xml?temp=.2552149

#17


to dxhdxh2k(dxhdxh)
你的那些方法我都知道,所以才开的这张贴

#18


既然要精确定时,就不该采用多任务操作系统,更不应该在意CPU资源使用率。

#19


to wabc(wabc)
CPU资源使用率高无所谓,只要系统慢的不要像死机就可以了。
我用以下方法后,虽然是我认为最好的计时器,用了之后,既使你计的时间是1秒,资源占用率也是100%,这个无所谓,但win2000系就像死机了一样,所有应用程序将停止响应,我用Ctrl+Alt+Delete打开任务管理器,可打开它却用了2分钟,我调整计时线程的优先级也不管用,但我若在循环中加入Sleep(1)
后,即使打开100个计时线程,cpu占用率也不会达到100%。
for(.....)
{
LARGE_INTEGER lCnt1,lFr,lCnt2;
     double f1,f2,fTime;
           QueryPerformanceCounter(&lCnt1);      //起始记时

        。。。。。

QueryPerformanceCounter(&lCnt2);
QueryPerformanceFrequency(&lFr);      //得到计数器的频率
f1=lCnt2.QuadPart-lCnt1.QuadPart;
f2=lFr.QuadPart;
fTime=(double)(f1/f2); //fTime就是所用的时间
}
.........

#20


gz

#21


我顶

#22


但是加入Sleep(1)就会影响精度了。

#23


坚决不用sleep(1)

用 SwitchToThread()

#24


to mostneed(现在是兼职称畜员) 
SwitchToThread()怎么用

#25


SwitchToThread()相当于一个Sleep(0)。将cpu交给其他线程

::Quote MSDN::

SwitchToThread
The SwitchToThread function causes the calling thread to yield execution to another thread that is ready to run on the current processor. The operating system selects the thread to yield to.

BOOL SwitchToThread(VOID);

#26


SwitchToThread unsupport win95/98

#27


学习!

#28


to mostneed(现在是兼职称畜员) 
为什么我调用SwitchToThread();编译出错
F:\portio1\rw\rwDlg.cpp(342) : error C2039: 'SwitchToThread' : is not a member of '`global namespace''
F:\portio1\rw\rwDlg.cpp(342) : error C2065: 'SwitchToThread' : undeclared identifier

#29


不支持win9x

==:quote: msdn ==

Requirements 
  Windows NT/2000/XP: Included in Windows NT 4.0 and later.
  Windows 95/98/Me: Unsupported.
  Header: Declared in Winbase.h; include Windows.h.
  Library: Use Kernel32.lib.

#30


to mostneed(现在是兼职称畜员)
我从不用98,我的操作系统是2000

#31


加上上述的头文件和连接库,也是一样

#32


你看看winbase.h

WINBASEAPI
BOOL
WINAPI
SwitchToThread(
    VOID
    );
#endif /* _WIN32_WINNT >= 0x0400 */

要求  _WIN32_WINNT >= 0x400

所以在 stdafx.h 头部加入:
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif

在vc7下编译不需要,我刚才换到vc6下也出问题了。

#33


::O

关注

#34


guanzhu

#35


问题基本解决,我用下面代码做了个方波振荡器,频率可以上去(我只试了50KHz计时间隔10us,但波形不好,容易受影响,可能是多线程的通病)可能是我现在能达到的最好的计时器了(基本达到要求)
for(.....)
{
LARGE_INTEGER lCnt1,lFr,lCnt2;
     double f1,f2,fTime;
           QueryPerformanceCounter(&lCnt1);      //起始记时

        。。。。。

QueryPerformanceCounter(&lCnt2);
QueryPerformanceFrequency(&lFr);      //得到计数器的频率
f1=lCnt2.QuadPart-lCnt1.QuadPart;
f2=lFr.QuadPart;
fTime=(double)(f1/f2); //fTime就是所用的时间
         SwitchToThread();//防止线程占用100%的资源

}
.........
另外,QueryPerformanceCounter();的速度实在不敢恭维,我想用汇编代码代替,为其加速,谁有他的汇编代码啊?

#36


实在不会,帮你up 一下,数据库还懂一点了。

#37


GetTickerCount()如何呢?

#38


Mark