#include "CallbackProxy.h"
#include <stdio.h>
/************************************************************************/
/* 非静态成员函数完全可以作为回调、线程函数 */
/************************************************************************/
class CTest
{
public:
CTest() : m_nData(0){}
DWORD WINAPI MemThreadFun(LPVOID)
{
// 至关重要:本例找到本函数的地址,直接将其强转为线程函数类型,未通过对象来调用本函数,将导致:
// 传入线程函数的参数本来会传递到形参上,但非静态成员函数的调用方法决定了:第一个参数函数的参数为隐式的this,故:传入线程的参数,最终传到了此处的this。
while (true)
{
// 此处this是否为空取决于传入线程的地址是否为空。当然如果故意传一些错误地址,这里把它作为了this,是会出错的。
if (this)
{
printf("thread running... m_nData = %d\n", m_nData);
// 先不考虑线程安全问题
m_nData++;
}
else
{
printf("thread running...\n");
}
Sleep(1000);
}
}
private:
int m_nData;
};
int main(int argc, char* argv[])
{
char aFunAddr[32] = { 0 };
// 只有此方法可以得到函数地址,“<<”因为类型限制取到的地址是错误的
sprintf_s(aFunAddr, "%d", &CTest::MemThreadFun);
UINT32 nFunAddr = atoi(aFunAddr);
CCallbackProxy runner;
CTest obj;
UINT32 nObjAddr = (UINT32)&obj;
runner.Set(nFunAddr);
runner.Run(&obj);
system("pause");
return 0;
}