【问题标题】:Exception Error while making a Clock/Timer class制作时钟/定时器类时出现异常错误
【发布时间】:2011-08-14 15:30:07
【问题描述】:

我正在尝试使用 timeGetTime 函数和其他函数制作时钟。但我不断收到异常错误。我知道也许程序的质量不是很好,但我只是想让它工作。应该是单身狗。我希望你能帮助我!

// The Clock header file

// The Clock API for meassuring time.
#include<Windows.h>
#include<WinBase.h>
#include<MMSystem.h>

class cTime
{
private:
    double m_Ns;
    double m_Ms;
    double m_S;
public:

    // Set Values
    void SetN(double N) {m_Ns = N;}
    void SetM(double M) {m_Ns = M;}
    void SetS(double S) {m_Ns = S;}

    // Get Values
    double GetN() {return m_Ns;}
    double GetM() {return m_Ms;}
    double GetS() {return m_S;}


// GetTime functions
//int GetDiffrenceNs();
//int GetDiffrenceMs();
//int GetDiffrenceS();
};

class cClock
{
private:
cTime m_CurrentTime;            // CurrentTime object
static cClock* m_pClock;                // Pointer to only instance
cTime m_LastTime;               // LastTime object

bool m_PerformanceCounter;      // Set to true if the performance counter         is available
double m_Frequency;         // Tells the frequenty of the     PerformanceCounter. The value that the PerformanceCounter will increase each second.
double m_CounterTime;           // The Counter of the PerformanceCounter.
double m_Trillingstijd;         // How long one count of the performance counter will take.

public:

static cClock* GetClock();

cTime CurrentTime(); // Get the CurrentTime.
cTime LastTime(); // Get the LastTime.

// Virtual destructor.
virtual ~cClock();

protected:
// Protected constructor.
cClock();
};

//时钟cpp文件

#include "Clock.h"


cClock* cClock::m_pClock = 0;

cClock* cClock::GetClock()
{

//BOOL perf_flag;        // Timer Selection Flag
//double time_factor;    // Time Scaling Factor
//LONGLONG last_time;    // Previous timer value
//LONGLONG perf_cnt;

if (QueryPerformanceFrequency((LARGE_INTEGER *) &m_pClock->m_Frequency)) 
    {

    QueryPerformanceCounter((LARGE_INTEGER *) &m_pClock->m_CounterTime);

    m_pClock->m_PerformanceCounter = true;
    m_pClock->m_Trillingstijd=1.0/m_pClock->m_Frequency;

    double LastedSeconds = m_pClock->m_CounterTime/m_pClock->m_Frequency;

    m_pClock->m_LastTime.SetN(LastedSeconds*1000000);
    m_pClock->m_LastTime.SetM(LastedSeconds*1000);
    m_pClock->m_LastTime.SetS(LastedSeconds);

} 

else 
{
    m_pClock->m_PerformanceCounter = false;

    double LastedMiliseconds = timeGetTime();

    m_pClock->m_LastTime.SetN(LastedMiliseconds*1000);
    m_pClock->m_LastTime.SetM(LastedMiliseconds);
    m_pClock->m_LastTime.SetS(LastedMiliseconds/1000);
}

return cClock::m_pClock;
}

cTime cClock::LastTime()
{
    return m_LastTime;
}

cTime cClock::CurrentTime()
{
if(m_PerformanceCounter)
{
    QueryPerformanceCounter((LARGE_INTEGER *) &m_CounterTime);

    double LastedSeconds = m_CounterTime/m_Frequency;

    m_CurrentTime.SetN(LastedSeconds*1000000);
    m_CurrentTime.SetM(LastedSeconds*1000);
    m_CurrentTime.SetS(LastedSeconds);
}
else 
{
    int LastedMiliseconds = timeGetTime();

    m_CurrentTime.SetN(LastedMiliseconds*1000);
    m_CurrentTime.SetM(LastedMiliseconds);
    m_CurrentTime.SetS(LastedMiliseconds/1000);
}

m_LastTime = m_CurrentTime;

return m_CurrentTime;

}

这是我的主要功能,非常简单,但我只是试图让它工作,但它没有......

#include "Clock.h"
#include<iostream>

using namespace std;

int main()
{
cClock* Clock = cClock::GetClock();
cTime Test = Clock->CurrentTime();

cout << Test.GetN();
cout << Test.GetM();
cout << Test.GetS();
int temp;
cin >> temp;
return 0;
}

【问题讨论】:

  • 题外话:对于一个简单的时钟来说,这是大量的代码。如果您有现代 C++,您可以使用来自&lt;chrono&gt;see this answer 的便携式高分辨率时钟作为示例。

标签: c++ class exception


【解决方案1】:

看来cClock* cClock::GetClock()这个方法使用m_pClock没有初始化(还是0)。

【讨论】:

    【解决方案2】:

    您永远不会创建cClock 的实例,只是访问指向一个的空指针。

    如果你真的认为单例是个好主意,那么cClock::GetClock() 将不得不创建一个,如果它还不存在的话;沿着

    cClock* cClock::GetClock()
    {
        if (!m_pClock) {
            m_pClock = new cClock;
        }
    
        // remainder of function
    
        return m_pClock;
    }
    

    请注意,这不是线程安全的,并且还会引入内存泄漏。单例很难在 C++ 中实现,最好避免,除非有真正的需要。我会将GetClock() 的逻辑移动到公共构造函数中,并允许客户端代码在它认为合适的时候创建和销毁时钟对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 2021-10-04
      相关资源
      最近更新 更多