2011-05-14 55 views
0

我正在编写一个程序来控制flashbulb。闪光灯响应用户的按键而闪光。我试图限制闪光灯的出现规律,以防止灯泡烧毁。我已经从这个论坛得到了一些帮助,但是我无法用我自己的方式实现这些代码。使用A类用户建议,具体如下:实现具有时间限制代码的类很难(C++)

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); 
     } 
    } 
}; 

我收到了几个语法错误,我似乎无法转移,所有这些都是在任一类的第一个或最后一个括号 - “语法错误:标识符'bulb'“,”语法错误:';'“,”语法错误:'}'“和”语法错误:'}'“。尽管如此,我从来没有和班级一起工作过,所以期待这与此有关。我哪里错了?

请注意'10000'是闪光之间的最小延迟。

+0

''我收到一些语法错误'' - 请将您收到的所有错误都复制到您的问题中。您提供的数据越多,您获得的相关答案就越多。 – pts 2011-05-14 13:18:26

+0

您需要在类声明的'}'后面的代码末尾使用分号。 – pts 2011-05-14 13:20:23

+0

谢谢,我已经添加到上述,以及我收到的错误 – CaptainProg 2011-05-14 13:26:35

回答

1

有你的代码的几个主要问题:

  • 缺少 ';'在类定义的末尾。
  • 在使用之前缺少定义HANDLE hSerial
  • 您在线路if (timepassed >= (((double)frequency)/10000))上错误地比较了时间和频率。如果您希望将计数器从QueryPerformanceCounter转换成实时使用类似:

    double RealTime = (double) clocks/(double) frequency;

如果您收到其他错误消息,他们之前或您发布的片段后都涉及到代码。一些更多的小问题和意见:

  • QueryPerformanceFrequencyQueryPerformanceCounter都可能失败。除非得到无效值无关紧要,否则应该检查这些值的返回值。
  • 您打开一个COM端口但不写任何内容或确认打开是否成功。
  • 为了避免未来的问题if语句if (clocks == 0)都应该在同一行或包括括号,即之一:

if (clocks == 0) clocks = li.QuadPart + 10000; 

if (clocks == 0) { 
    clocks = li.QuadPart + 10000; 
} 

编辑:实例转换QueryPerformanceCounter的成真次(检查不包括错误):

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; 

另请参见:How to use QueryPerformanceCounter?

+0

谢谢 - 我已经实现了你所提到的一切,但不理解QueryPerformanceCounter到'实时'的转换。我被这个论坛的另一个成员给了上述代码的大部分,不知道如何使用“频率” - 据我所知,它将始终保持为零?如果是这种情况,RealTime将始终是QueryPerformanceCounter值除以零,这是不可能的。您的帮助表示赞赏! – CaptainProg 2011-05-14 13:53:30

+0

I强烈反对最后一点(关于方括号) - 关于后来添加新行的观点并没有出售我,因为我从来没有见过任何人这样做过。而且,格式化问题与OP的代码无关任何情况下 – 2011-05-14 14:56:30

+0

它更像是一个可能超出问题范围的风格问题,但在大多数讨论中,人们似乎更喜欢使用大括号或将其全部保留在一行上:for示例请参阅http://stackoverflow.com/questions/815601/to-do-or-not-to-do-one-line-if-statements-and-curly-braces,以获得关于SO的其他讨论。 – uesp 2011-05-15 01:07:27

0

代码中的最后}之后添加;

class bulb 
{ 
... 
}; 
+0

谢谢 - 完成。仍然有相同的错误,但感谢那 – CaptainProg 2011-05-14 13:23:48

+0

那么,可能是最好的显示完整的代码? – 2011-05-14 13:27:20

+0

是的,我从评论开始就添加了它。虽然:( – CaptainProg 2011-05-14 13:30:17