一个类里面的Timer方法

时间:2014-07-18 09:13:13

标签: c++ visual-studio-2008

首先介绍我的开发环境:

OS: Windows.
SDK: Microsoft Visual Studio 2008.

今天早些时候我遇到了尝试在类中定义Timer的问题。我的类是连接Python嵌入式模块和C ++后端,我的问题是我需要在python模块上接收一些时间事件。另外需要注意的是,这个类只有一个实例。

主要问题是当我使用:

定义计时器时
/* Null, 0, mseconds, CALLBACK_METHOD */
SetTimer(NULL, 0, 100, (TIMERPROC) OnTimer);

在timer事件(OnTimer)上激活的方法需要是我的Class上的静态方法(然后我无法访问该类中的任何非静态方法或变量)。

在codeproject上阅读一些代码我发现:http://www.codeproject.com/Articles/4817/How-to-use-SetTimer-with-callback-to-a-non-static

我有类似的实现但没有行:

void * CSleeperThread::pObject;

CSleeperThread *pSomeClass = (CSleeperThread*)pObject; // cast the void pointer
pSomeClass->TimerProc(hwnd, uMsg, idEvent, dwTime); // call non-static function

这是实现我正在寻找的功能的唯一方法吗?我是否有更简单的方法可以跳过我的信息收集过程?

2 个答案:

答案 0 :(得分:2)

创建Class对象的静态地图:

static std::map<UINT_PTR, CMyClass*> m_CMyClassMap; //declaration

在对象创建时,在此地图中插入对象:

CMyClass myClassObj;
CMyClassMap.insert(std::pair<int, CMyClass*>(0, &myClassObj));

现在,您可以在静态方法中使用它来访问其非静态成员。

int a = m_CMyClassMap[0]->m_someNonStaticMember;

答案 1 :(得分:0)

只要这个类只有一个实例,就有一个简单的(如果有点丑陋)解决方案:声明你的类对象,然后在全局对象中存储一个指向它的指针。例如,

MyClass myObject;
MyClass* self = &myObject;

然后在静态成员中,您可以使用self-&gt; myMethod()或self-&gt; myData来引用非静态项目。