C++ 使用时间限制代码(C+;+;)实现类的困难
我正在写一个控制闪光灯的程序。当用户按键时,闪光灯会触发。我试图限制闪光的发生规律,以防止灯泡烧坏。我已经从这个论坛得到了一些帮助,但是我自己无法实现代码。用户建议使用一个类,如下所示:C++ 使用时间限制代码(C+;+;)实现类的困难,c++,class,C++,Class,我正在写一个控制闪光灯的程序。当用户按键时,闪光灯会触发。我试图限制闪光的发生规律,以防止灯泡烧坏。我已经从这个论坛得到了一些帮助,但是我自己无法实现代码。用户建议使用一个类,如下所示: class bulb { __int64 clocks; __int64 frequency; public: bulb() { LARGE_INTEGER li; QueryPerformanceFrequency(&li);
class bulb
{
__int64 clocks;
__int64 frequency;
public:
bulb()
{
LARGE_INTEGER li;
QueryPerformanceFrequency(&li);
frequency = li.QuadPart;
clocks = 0;
}
void WINAPI flash (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
LARGE_INTEGER li;
QueryPerformanceCounter(&li);
// If this is the first occurence, set the 'clocks' to system time (+10000 to allow flash to occur)
if (clocks == 0) clocks = li.QuadPart + 10000;
__int64 timepassed = clocks - li.QuadPart;
if (timepassed >= (((double)frequency) / 10000))
{
//Set the clock
clocks = li.QuadPart;
//Define the serial port procedure
HANDLE hSerial;
//Open the serial port (fire the flash)
hSerial = CreateFile("COM1", GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
//Close the serial port
CloseHandle(hSerial);
}
}
};
我收到了一些似乎无法转移的语法错误,它们都位于类的第一个或最后一个括号——“语法错误:标识符'bull'”、“语法错误:';'”、“语法错误:'}'”和“语法错误:'}'”。不过,我以前从来没有上过课,所以我想这是与之相关的。我哪里做错了
请注意,“10000”是闪烁之间的最小延迟。添加
代码>在代码中最后一个}
之后
class bulb
{
...
};
您的代码有几个主要问题:
- 缺少一个“;”在类定义的末尾
- 使用前缺少定义
句柄hSerial
- 如果(timepassed>=((double)frequency)/10000))
行上的时间和频率比较不正确。如果您希望将计数器从QueryPerformanceCounter
转换为实时计数器,请使用以下命令:
double RealTime=(双)时钟/(双)频率代码>
如果您收到其他错误消息,则它们与您发布的代码片段之前或之后的代码相关。还有一些小问题和意见:
QueryPerformanceFrequency
和QueryPerformanceCounter
都可能失败。除非获取无效值无关紧要,否则您应该检查这些值的返回值
- 您打开一个COM端口,但不向其写入任何内容,也不确认打开是否成功
- 为避免将来出现问题,if语句
if(clocks==0)
应全部位于一行或包含括号,即:
:
编辑:将QueryPerformanceCounter转换为实时的示例(不包括错误检查):
另请参见:“我收到一些语法错误”-请将收到的所有错误复制到问题中。您提供的数据越多,您可以得到的相关答案就越多。您需要在类声明的}
之后的代码末尾加一个分号。谢谢,我已经在上面添加了分号,以及我收到的错误。我看到您没有声明hSerial
谢谢-也修复了这个问题。同样的错误也适用:SThanks-done。仍然有相同的错误,但谢谢你是的,我已经在你的评论中添加了它。但错误是相同的:(谢谢-我已经实现了你提到的所有功能,但不理解QueryPerformanceCounter到“实时”的转换。我被这个论坛的另一个成员给了上面的大部分代码,但不理解“频率”是如何使用的-据我所知,它将始终保持为零?如果是这种情况,那么实时将始终保持不变。)s是QueryPerformanceCounter值除以零,这是不可能的。感谢您的帮助!我强烈不同意最后一点(关于括号)--关于以后添加新行的争论没有说服我,因为我从未见过有人这样做。曾经。而且格式问题在任何情况下都不是OP代码的真正问题。它更多的是一个风格问题,可能超出了问题的范围,但在大多数讨论中,人们似乎更喜欢保留大括号或将其全部保留在o上ne行:例如,请参阅其他人之间的良好讨论。
if (clocks == 0) clocks = li.QuadPart + 10000;
if (clocks == 0) {
clocks = li.QuadPart + 10000;
}
LARGE_INTEGER Frequency;
LARGE_INTEGER Counter;
QueryPerformanceFrequency(&Frequency);
QueryPerformanceCounter(&Counter);
//Time in seconds
double RealTime = (double) Counter.QuadPart / (double)Frequency.QuadPart;
LARGE_INTEGER Counter1;
QueryPerformanceCounter(&Counter1);
//Elapsed time in seconds
double DeltaTime = (double) (Counter1.QuadPart - Counter.QuadPart) / (double)Frequency.QuadPart;