`
lovnet
  • 浏览: 6881346 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

关于VC中的时间函数讨论

阅读更多

关于在VC中时间函数的事业问题在论坛有不少的帖子讨论,下面结合讨论结果和相关的知识做个总结。

先从一个如何在程序中延时的问题谈起,延时的方法有
方法一:
使用sleep函数,它的最小单位是1ms,如延时2秒,用sleep(2000)。
方法二:
使用sleep函数的不利处在于期间不能处理其他的消息,如果时间太长,就好象死机一样,所以我们利用

COleDateTime类和COleDateTimeSpan类结合WINDOWS的消息处理过程来实现延时:
COleDateTime start_time = COleDateTime::GetCurrentTime();
COleDateTimeSpan end_time = COleDateTime::GetCurrentTime()-start_time;
While(end_time.GetTotalSeconds() <= 2) //实现延时2秒
{
MSG? msg;
GetMessage(&msg,NULL,0,0);
TranslateMessage(&msg);
DispatchMessage(&msg);
End_time = ColeDateTime::GetCurrentTime-start_time;
}//这样在延时的时候我们也能够处理其他的消息。
方法三:
可以采用GetTickCount()函数,该函数的返回值是DWORD型,表示以毫秒为单位的计算机启动后经历的时间间隔。
DWORD dwStart = GetTickCount();
DWORD dwEnd = dwStart;
do
{
MSG? msg;?
GetMessage(&msg,NULL,0,0);?
TranslateMessage(&msg);
DispatchMessage(&msg);
dwEnd = GetTickCount();?
} while((dwEnd - dwStart)? <=? 2000);
上面的方法在延时的精确度上,很多时候不能满足我们的要求,下面是一种更精确的微秒级延时:
LARGE_INTEGER litmp ;
LONGLONG QPart1,QPart2 ;
double d=0;
QueryPerformanceCounter(&litmp) ;
// 获得初始值
QPart1 = litmp.QuadPart ;
while (d<40)//你想要的时间
{
QueryPerformanceCounter(&litmp) ;
QPart2 = litmp.QuadPart ;
d=(double)(QPart2 - QPart1);
}

再看看仅供WIN9X使用的高精度定时器:QueryPerformanceFrequency()和QueryPerformanceCounter(),要求计算机从硬件上支持高精度定时器。函数的原形是:
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
数据类型LARGEINTEGER既可以是一个作为8字节长的整数,也可以是作为两个4字节长的整数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:
typeef union _ LARGE_INTEGER
{
struct
{
DWORD LowPart;
LONG? HighPart;
};
LONGLONG QuadPart;
} LARGE_INTEGER;
在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。测试函数SLEEP(100)的精确持续时间方法:
LARGE_INTEGER litmp;
LONGLONG qt1,qt2;
double dft,dff,dfm;
QueryPerformanceFrequency(&litmp);//获得时钟频率
dff=(double)litmp.QuadPart;
QueryPerformanceCounter(&litmp);//获得初始值
qt1=litmp.QuadPart;Sleep(100);
QueryPerformanceCounter(&litmp);//获得终止值
qt2=litmp.QuadPart;
dfm=(double)(qt2-qt1);
dft=dfm/dff;//获得对应的时间值
需要注意的是DFT计算的结果单位是秒。
参考连接:
http://dev.csdn.net/develop/article/31/31188.shtm
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=195559

分享到:
评论

相关推荐

    VC中内联函数的定义和案例共3页.pdf.zip

    在VC这样的编译器中,内联函数的使用能够显著减少程序运行时的时间消耗,尤其是在频繁调用的小型函数中。 内联函数的定义通常在类声明中进行,使用`inline`关键字修饰。例如: ```cpp class MyClass { public: ...

    VC onTimer()函数实现秒表功能.rar

    下面将详细讨论`onTimer()`函数的工作原理以及如何在秒表应用中使用它。 `onTimer()`函数是MFC(Microsoft Foundation Classes)框架中的一个成员函数,通常与`CWnd`或其派生类关联,如`CButton`、`CDialog`等。当...

    ifft.rar_fft ifft_ifft_ifft vc csdn_ifft函数_傅立叶 函数 c++

    在计算机科学中,快速傅立叶变换(FFT)是计算离散傅立叶变换(DFT)的一种高效算法,其时间复杂度由普通DFT的O(n^2)降低到了O(n log n)。FFT通常用于信号的频谱分析,它能够揭示信号在不同频率成分上的分布情况。 ...

    关于DLLMAIN()入口函数的讨论

    关于DLLMAIN()入口函数的讨论,是讨论关于DLLMAIN()这个DLL入口函数的重要性和必要性的问题,我用VS2005列举了两个例子供大家参考.同时讨论了VC的约定的重要性,我在写这两个例子的时候就遇到同样的问题,用了一个上午的...

    MFC数字钟(基于VC6.0)

    在本项目中,我们将讨论如何使用VC6.0作为开发环境,利用MFC来创建一个简单的数字时钟应用。 首先,我们需要理解MFC中的CWinApp类。它是所有MFC应用程序的核心,负责初始化、运行以及退出应用程序。在创建项目时,...

    vc实现微秒级精度定时器

    Visual C++ 中提供了很多关于时间操作的函数,可以利用它们控制程序能够精确地完成定时和计时操作。WM_TIMER 消息映射能进行简单的时间控制,可以使用 SetTimer() 函数设置定时间隔,然后在应用程序中增加定时响应...

    SDL2-2.28.5,VC2022依赖库

    描述中提到,这个压缩包包含的是已经编译完成的SDL2库,这意味着开发者无需从源代码编译,可以直接在Visual Studio 2022项目中引用,节省了配置和编译的时间。这通常包括.lib静态链接库文件、.dll动态链接库文件以及...

    vc++ api函数(Windows API大全)下载

    9. **错误处理**:讨论了如何正确处理API调用中可能出现的错误,包括错误码的获取和含义,以及调试技巧。 10. **实例分析**:提供了丰富的示例代码,帮助读者将理论知识转化为实践,通过实际编程加深对Windows API...

    VC做的钟,显示时间

    在本案例中,我们讨论的是一个使用VC编写的特殊应用:一个能够在文档中实时显示当前时间的钟。 要实现这个功能,首先我们需要了解VC中的MFC(Microsoft Foundation Classes)库。MFC是Microsoft为Windows编程提供的...

    VC计时器,精确到0.01秒,定义了快捷键

    在VC中,我们可以利用Windows API函数或者MFC(Microsoft Foundation Classes)类来实现计时器功能。这里,我们可能使用`SetTimer`函数创建一个定时器,该函数会在指定的时间间隔后发送一个WM_TIMER消息到指定的窗口...

    SYSTEMTIME.rar_SYSTEMTIME VC_SystemTime _SystemTime.rar_VC SYST

    标题中的"SYSTEMTIME.rar"和描述中提到的"VC++中获取系统时间及程序运行时间",表明我们讨论的核心是关于在Visual C++ (VC++)编程环境中如何利用`SYSTEMTIME`结构体获取和处理系统时间。`SYSTEMTIME`是Windows API...

    浅谈HOOK技术在VC编程中的应用

    标题“浅谈HOOK技术在VC编程中的应用”暗示了本文将讨论在Visual C++(简称VC)编程环境中如何运用HOOK技术。HOOK技术是一种在Windows操作系统中广泛使用的编程技巧,它允许程序员拦截和处理系统或应用程序级别的...

    用vc6.0开发的一个小游戏!入门级

    在VC6.0中,可以使用iostream库来处理标准输入输出,而在Windows环境中,还可以利用WinAPI函数获取鼠标和键盘事件。 5. 图形绘制:虽然VC6.0不直接支持现代图形库如OpenGL或DirectX,但可以通过Windows GDI...

    VC计时器

    【VC计时器】是一个基于Visual C++(简称VC)开发的计时工具,它允许开发者或用户在编程过程中或日常使用中实现精准的时间测量。计时器在软件开发、性能测试、游戏编程等多个领域都有广泛应用,对于理解和优化代码...

    VC6 线程+定时器应用程序源码

    2. **AfxBeginThread**:在VC6中,`AfxBeginThread`函数用于创建MFC(Microsoft Foundation Classes)线程。该函数接受一个`AFX_THREADPROC`类型的函数指针,该指针指向线程函数,以及一个参数,用于传递给线程函数...

    Matlab与VC方法.rar_matlab vc_vc matlab

    通过这个API,开发者可以在VC程序中启动Matlab,运行Matlab脚本,调用Matlab函数,甚至读写Matlab变量。 5. **性能优化**:在结合Matlab和VC时,应关注性能优化。例如,将长时间运行的计算任务放在C++代码中,而把...

    VCMFC求系统当前时间与已保存的时间的差值

    本例中,我们将重点讨论如何通过MFC获取当前系统时间,并计算其与之前保存的时间之差。 ### 二、获取当前系统时间 #### 2.1 使用CTime类获取时间 首先,我们需要使用`CTime`类来获取当前系统时间。代码如下: ```...

    读取串口数据并画实时曲线.zip_VC 串口_VC 曲线绘制_vc 实时曲线_串口通信_读取串口数据

    接下来,我们讨论**VC6.0中的曲线绘制**。在VC6.0中,可以使用MFC(Microsoft Foundation Classes)库中的CWnd类及其派生类来创建自定义的绘图窗口。我们可以继承CWnd类,重写`OnPaint`函数,在这里使用CDC类的绘图...

    24小时精通vc .rar

    《24小时精通VC》是一本旨在帮助读者在短时间内快速掌握Microsoft Visual C++(简称VC)编程技术的教程。这本教程可能包含了从基础到高级的全面内容,旨在让学习者在一天之内对VC编程有深入的理解和实践能力。通过24...

    用VC制作的小闹钟软件

    在这个特定的例子中,我们讨论的是一款由VC编写的简单小闹钟程序,它具备获取系统时间、设定自定义时间以及设置闹钟功能,并且选择了《梦醒时分》作为默认的闹钟提示音。 首先,让我们深入了解一下VC++。VC++是微软...

Global site tag (gtag.js) - Google Analytics