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;