c++ - C++ Windows 窗体应用程序中的 QueryPerformanceCounter 用法
问题描述
我正在尝试使用 QueryPerformanceCounter 和 QueryPerformanceFrequency 计时器,以便在我的 Windows 窗体 GUI (Visual C++) 中获得高分辨率时间戳。我这边的问题是我不知道在表单中使用它的确切方法。
我发现的示例清楚地描述了 StartCounter() 和 GetCounter() 但我想知道如何使用 MyForm.h 中的 button_Click 回调函数调用它
目标是在 GUI 中按下按钮后定期发送消息。
你能在这个问题上支持我吗?谢谢!
double PCFreq = 0.0;
__int64 CounterStart = 0;
double vartest = 0;
void StartCounter()
{
LARGE_INTEGER li;
//if (!QueryPerformanceFrequency(&li))
PCFreq = double(li.QuadPart);
QueryPerformanceCounter(&li);
CounterStart = li.QuadPart;
}
double GetCounter()
{
LARGE_INTEGER li;
QueryPerformanceCounter(&li);
return double(li.QuadPart - CounterStart) / PCFreq;
}
解决方案
正如我在评论中建议的那样,如果目标是在表单应用程序的主线程上定期执行某些操作,则您希望使用 .NET 中的 Timer 类或 Win32 SetTimer 函数来安排在给定时间间隔发生的回调。
QueryPerformanceCounter 可能比您需要的更精确。相反,使用GetTickCount64来获取系统时间的毫秒计数器。
ULONGLONG CounterStart = 0;
void StartCounter()
{
CounterStart = GetTickCount64();
}
double GetCounter()
{
ULONGLONG currentTime = GetTickCount64();
ULONGLONG diff = currentTime - CounterStart;
return (diff / 1000.0); // convert milliseconds to seconds as a double
}
推荐阅读
- php - 如何从逗号分隔列表中删除以“no”开头的短语及其各自的逗号,留下其余的?
- python - 在 python 列表中交换和反转元素
- python - numpy.loadtxt() 如何处理文本编码?(它与以下错误有什么关系?)
- flutter - Flutter DropdownButtonFormField 不适用于长列表
- php - 将浏览器从根文件夹重定向到网站中的同级文件夹
- java - 尝试在 AsyncTask 中添加通知生成器
- reactjs - Redux:在我更改状态元素的属性后,这会是相同的状态吗?
- javascript - 在 ReactJS 中的映射内映射
- laravel - Laravel 5.7 简单分页
- c - 鉴于 1、2、5、26、677,我需要打印到第 N 项和第 N 项。