怎么获得当前时间的毫秒,微秒数?! 怎么获得当前时间的毫秒,微秒数?! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 windows下:ftime 微妙unix下有更精确的 gettimeofday() 纳秒 ftime()微妙 提醒你: 在i386机器上 无法取得精确道毫秒的时间!cpu 多任务调度 时间片就20ms 即使用用取时钟计数器的办法(gettimeday())也无法保证CPU 是否跳动! GetSystemTime(SystemStruct ptime)?=lpSystemStruct.millons 用它吧没错,查一下msdn 中GetSystemTime()函数吧,ptime就是你的东东 楼上再开玩笑。 常用函数只能处理到55毫秒,因为每秒中断18次。我两年前用过,使用系统的多媒体时钟,可以精确到840ns!函数名忘了 Get..Frequency.. sorry 各位不知道试过没有 GetSystemTime()的毫秒根本就是假的! 连续取1000次时间!! 看看问题就出来了! 最少都是10ms跳动! 楼上说的办法(取时钟计数器) 是最精确的了 不过还是有问题! 你在连续测试1000000 或者更多! 中间还是有跳动的!! 这是cpu跳动没办法! 下面程序比较 可以看看:#include <windows.h>#include <stdio.h>#include <mmSystem.h>#pragma comment(lib, "Winmm.lib" )class CHiResDateTime {public: CHiResDateTime() { m_nTickTimeMark= timeGetTime(); // multimedia timer running with at 1ms ticks GetSystemTimeAsFileTime( (LPFILETIME)&m_n64TimeMark ); } SYSTEMTIME* Now( SYSTEMTIME* prST= 0) { DWORD nTick= timeGetTime() - m_nTickTimeMark; LONGLONG n64Cur= m_n64TimeMark + (nTick * 10000); // cvt to 100-ns units FileTimeToSystemTime( (LPFILETIME)&n64Cur, &m_rST ); if (prST != 0) *prST= m_rST; return( &m_rST ); };private: DWORD m_nTickTimeMark; // ms internvals (*10,000 = 100ns intervals) LONGLONG m_n64TimeMark; // 100 ns intervals SYSTEMTIME m_rST;};void main(){ CHiResDateTime t; SYSTEMTIME rST, rST2; for (int j=0; j< 20000; j++ ) { t.Now( &rST ); GetSystemTime( &rST2 ); printf("HiRes: %02d:%02d:%02d.%03d ",rST.wHour,rST.wMinute,rST.wSecond,rST.wMilliseconds ); printf(" Std: %02d:%02d:%02d.%03d\n",rST2.wHour,rST2.wMinute,rST2.wSecond,rST2.wMilliseconds ); } // alternate usage: printf(" This year is: %d\n", t.Now()->wYear ); printf(" This hour is: %d\n", t.Now()->wHour );}=-=-=-=-=-=-=- Output:HiRes: 01:48:40.930 Std: 01:48:40.930HiRes: 01:48:40.931 Std: 01:48:40.930HiRes: 01:48:40.934 Std: 01:48:40.930...HiRes: 01:48:40.935 Std: 01:48:40.930...HiRes: 01:48:40.940 Std: 01:48:40.930HiRes: 01:48:40.941 Std: 01:48:40.930HiRes: 01:48:40.942 Std: 01:48:40.930...HiRes: 01:48:40.978 Std: 01:48:40.930HiRes: 01:48:40.979 Std: 01:48:40.990...HiRes: 01:48:40.983 Std: 01:48:40.990...HiRes: 01:48:40.999 Std: 01:48:40.990HiRes: 01:48:41.000 Std: 01:48:40.990HiRes: 01:48:41.003 Std: 01:48:40.990...HiRes: 01:48:41.036 Std: 01:48:40.990HiRes: 01:48:41.036 Std: 01:48:41.040HiRes: 01:48:41.042 Std: 01:48:41.040...HiRes: 01:48:41.089 Std: 01:48:41.040HiRes: 01:48:41.090 Std: 01:48:41.100......HiRes: 01:48:41.099 Std: 01:48:41.100HiRes: 01:48:41.102 Std: 01:48:41.100HiRes: 01:48:41.102 Std: 01:48:41.100 如何知道组建已经初始化CoInitialize 哪个专家解释一下 如何禁止系统显示各种对话框,如发现硬件对话框,出错对话框,提示对话框,还有右键菜单,统统不让显示 透明打印 大家能否给我介绍一下系统消息,我不太明白. 在那里能下到关于程序调试、MFC类库和WinAPI方面的书?另:VC程序有没有自带的打包程序? 怎样将ListBox清空! 关于消息统一管理 102个错误,天呀! 如何能够动态定义DLL函数结构 请问哪里有Visual C++全部错误消息的中文解释说明 shell编程中路径转换问题
unix下有更精确的 gettimeofday() 纳秒 ftime()微妙
cpu 多任务调度 时间片就20ms 即使用用取时钟计数器的办法(gettimeday())
也无法保证CPU 是否跳动!
?=lpSystemStruct.millons
用它吧没错,查一下msdn 中GetSystemTime()函数吧,ptime就是你的东东
我两年前用过,使用系统的多媒体时钟,可以精确到840ns!
函数名忘了 Get..Frequency.. sorry
GetSystemTime()的毫秒根本就是假的! 连续取1000次时间!! 看看
问题就出来了! 最少都是10ms跳动!
楼上说的办法(取时钟计数器) 是最精确的了 不过还是有问题!
你在连续测试1000000 或者更多! 中间还是有跳动的!! 这是cpu跳动没办法!
下面程序比较 可以看看:
#include <windows.h>
#include <stdio.h>
#include <mmSystem.h>
#pragma comment(lib, "Winmm.lib" )
class CHiResDateTime {
public:
CHiResDateTime() {
m_nTickTimeMark= timeGetTime(); // multimedia timer running with at 1ms ticks
GetSystemTimeAsFileTime( (LPFILETIME)&m_n64TimeMark );
}
SYSTEMTIME* Now( SYSTEMTIME* prST= 0) {
DWORD nTick= timeGetTime() - m_nTickTimeMark;
LONGLONG n64Cur= m_n64TimeMark + (nTick * 10000); // cvt to 100-ns units
FileTimeToSystemTime( (LPFILETIME)&n64Cur, &m_rST );
if (prST != 0) *prST= m_rST;
return( &m_rST );
};
private:
DWORD m_nTickTimeMark; // ms internvals (*10,000 = 100ns intervals)
LONGLONG m_n64TimeMark; // 100 ns intervals
SYSTEMTIME m_rST;
};
void main()
{
CHiResDateTime t;
SYSTEMTIME rST, rST2;
for (int j=0; j< 20000; j++ ) {
t.Now( &rST );
GetSystemTime( &rST2 );
printf("HiRes: %02d:%02d:%02d.%03d ",rST.wHour,rST.wMinute,rST.wSecond,rST.wMilliseconds );
printf(" Std: %02d:%02d:%02d.%03d\n",rST2.wHour,rST2.wMinute,rST2.wSecond,rST2.wMilliseconds
);
}
// alternate usage:
printf(" This year is: %d\n", t.Now()->wYear );
printf(" This hour is: %d\n", t.Now()->wHour );
}
=-=-=-=-=-=-=- Output:
HiRes: 01:48:40.930 Std: 01:48:40.930
HiRes: 01:48:40.931 Std: 01:48:40.930
HiRes: 01:48:40.934 Std: 01:48:40.930
...
HiRes: 01:48:40.935 Std: 01:48:40.930
...
HiRes: 01:48:40.940 Std: 01:48:40.930
HiRes: 01:48:40.941 Std: 01:48:40.930
HiRes: 01:48:40.942 Std: 01:48:40.930
...
HiRes: 01:48:40.978 Std: 01:48:40.930
HiRes: 01:48:40.979 Std: 01:48:40.990
...
HiRes: 01:48:40.983 Std: 01:48:40.990
...
HiRes: 01:48:40.999 Std: 01:48:40.990
HiRes: 01:48:41.000 Std: 01:48:40.990
HiRes: 01:48:41.003 Std: 01:48:40.990
...
HiRes: 01:48:41.036 Std: 01:48:40.990
HiRes: 01:48:41.036 Std: 01:48:41.040
HiRes: 01:48:41.042 Std: 01:48:41.040
...
HiRes: 01:48:41.089 Std: 01:48:41.040
HiRes: 01:48:41.090 Std: 01:48:41.100
...
...
HiRes: 01:48:41.099 Std: 01:48:41.100
HiRes: 01:48:41.102 Std: 01:48:41.100
HiRes: 01:48:41.102 Std: 01:48:41.100