自己写了个C++计时器类,可用作秒表和计时
2015-07-23 11:09
453 查看
首先说一下,这是我在 CSDN 上的第一个文章,其实这个账号早在几年前就申请了,不过当时只是为了下载一个资源,而且也不怎么懂信息技术相关的领域,后来就再也没怎么动过,直到今天我才开始使用这个账号。我刚刚接触编程不到一年,因此有什么错误请指正。
这个代码的作用是实现秒表的功能,精确到微秒,采用 QueryPerformance 的两个函数,参考了 http://blog.sina.com.cn/s/blog_4dbcd2730100xbji.html 中的代码并稍稍做了些改进。
可以到这里下载代码:http://pan.baidu.com/s/1bnz2kpT
有个不足是该程序在运行时CPU占用率特别高,不知哪位高人能否改进一下,谢谢!
【Timer.h】注意:函数的实现并没有单独放在CPP里,如有需要请自行改正。
这个代码的作用是实现秒表的功能,精确到微秒,采用 QueryPerformance 的两个函数,参考了 http://blog.sina.com.cn/s/blog_4dbcd2730100xbji.html 中的代码并稍稍做了些改进。
可以到这里下载代码:http://pan.baidu.com/s/1bnz2kpT
有个不足是该程序在运行时CPU占用率特别高,不知哪位高人能否改进一下,谢谢!
【Timer.h】注意:函数的实现并没有单独放在CPP里,如有需要请自行改正。
#pragma once //如果你的编译器不支持该定义请增加判断宏 __Timer_H__ #include<Windows.h> //定义一个计时器,自动初始化为归零状态。 class Timer { public: enum TimerStatus { ZERO,//置零状态 RUN,//运行状态 PAUSE//暂停状态 }; private: UINT _freq; LARGE_INTEGER _begin; LARGE_INTEGER _end; TimerStatus status; LONGLONG costTime; //计时器运行的时间(微秒) UINT days, hours, minutes, seconds, milliseconds, microseconds; public: Timer() { LARGE_INTEGER tmp; QueryPerformanceFrequency(&tmp); _freq = static_cast<int>(tmp.QuadPart); costTime = 0; days = hours = minutes = seconds = milliseconds = microseconds = 0u; status = ZERO; } TimerStatus Status() { return status; } //开始计时 void Start() { status = RUN; QueryPerformanceCounter(&_begin); } //该函数只将当前时间的结果计算并保存到 costTime 及时间变量中,不会返回任何数值。 void Calc() { QueryPerformanceCounter(&_end); costTime += _end.QuadPart - _begin.QuadPart; _begin = _end; days = costTime * 1000000u / _freq; //因为最后结果会保存到 days 变量中,此处可直接用 days 存储中间结果。 microseconds = days % 1000u; milliseconds = (days /= 1000u) % 1000u; seconds = (days /= 1000u) % 60u; minutes = (days /= 60u) % 60u; hours = (days /= 60u) % 24u; days = days / 24u; } //停止计时 void Pause() { status = PAUSE; Calc(); } //计时器归零 void Reset() { status = ZERO; costTime = 0; microseconds = milliseconds = seconds = minutes = hours = days = 0; } //天 UINT Days() { return days; } //小时 UINT Hours() { return hours; } //分钟 UINT Minutes() { return minutes; } //秒 UINT Seconds() { return seconds; } //毫秒 UINT Milliseconds() { return milliseconds; } //微秒 UINT Microseconds() { return microseconds; } };【控制台光标控制.h】实现光标控制
#pragma once CONSOLE_CURSOR_INFO CursorInfo; COORD coord; //移动控制台中的光标至指定位置,第一个参数为横坐标,第二个参数为纵坐标。 void gotoXY(int x, int y) { coord = { x, y }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); } void SetCursorSize(DWORD size, BOOL visible) { CursorInfo = { size, visible }; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &CursorInfo); }【Main.cpp】主程序代码
#include"Timer.h" #include"控制台光标控制.h" #include<iostream> #include<conio.h> int main(int argc, char *argv[]) { SetThreadAffinityMask(GetCurrentThread(), 0x01); //固定只使用一个线程 bool LoopOn = true; Timer timerA; char key = NULL; std::cout << "计时器:按【Enter/空格】开始/暂停,按【R】归零,按【Esc】结束。" << std::endl; while (LoopOn) { gotoXY(0, 1); printf_s("%2d:%02d\'%02d\"%03d%03d", timerA.Hours(), timerA.Minutes(), timerA.Seconds(), timerA.Milliseconds(), timerA.Microseconds()); timerA.Status() != timerA.TimerStatus::RUN || _kbhit() ? key = _getch() : key = NULL; switch (key) { case '\r':case '\n':case VK_SPACE: switch (timerA.Status()) { case timerA.TimerStatus::ZERO:case timerA.TimerStatus::PAUSE: gotoXY(0, 0); std::cout << "计时 " << std::endl; timerA.Start(); SetCursorSize(1, 0); break; case timerA.TimerStatus::RUN: gotoXY(0, 0); std::cout << "暂停。" << std::endl; timerA.Pause(); SetCursorSize(16, 1); break; default: break; } break; case 'r':case 'R': gotoXY(0, 0); std::cout << "归零。 " << std::endl; timerA.Pause(); timerA.Reset(); SetCursorSize(16, 1); break; case VK_ESCAPE: gotoXY(0, 0); std::cout << "已退出。 " << std::endl; timerA.Pause(); SetCursorSize(16, 1); LoopOn = false; break; default: if (timerA.Status() == timerA.TimerStatus::RUN) timerA.Calc(); break; } } putchar(10); Sleep(2000); }
相关文章推荐
- 带游戏的简单图书馆管理小程序
- Unity3D脚本:C#计时类脚本
- C语言中计时的方法
- 对Python中常用迭代方法进行计时
- 在Android中使用AlarmManager
- android之计时器 chronometer
- 宏Macro定义代替常用语句块的示例(计时)
- 一道沙漏面试题
- 如何在 MATLAB 中计算程序运行时间
- cloct_t计时用法
- 如何测量程序的运行时间
- CUDA的计时方法
- STM32 定时器 定时时间的计算
- JavaScript到计时页面跳转
- python脚本--单位时间内计时
- delphi 统计运行时间
- Java程序运行时间计算
- RIP协议之初级篇
- android开发 倒计时和计时的实现
- C++11 新的计时方法——std::chrono 大法好