把系统CALLBACK函数封装到C++类里

简介:

在《定制一个eVC上的中文模拟器》一文回复中,bxianch朋友问到“EVC中的线程,为什么要声明称 static呢,而在静态的函数中药调用非静态成员还不能调用,必须把这些成员也设置成静态的,不怎么方便,有好的解决方法吗”。

其原因是把CALLBACK函数封装成C++类的非静态成员后,需要有建立对象,再通过对象才能去找到这个成员函数。而系统调用这个CALLBACK函数的时候,才不管你有没有建立对象呢。典型的解决方法是需要用静态成员函数给系统CALL。然后设法把THIS指针传给这个STATIC函数,让这个STATIC函数通过THIS指针访问到当前对象里的成员函数,那么这个成员函数就可以轻松操作所有成员变量了。这种方法适用于所有系统CALLBACK。

以CreateThread为例,

class CTest
{
public:
 CTest();
 ~CTest();
 static DWORD WINAPI ThreadCallback(PVOID pParam);   //这个是系统要的东东,没有对象也能直接访问STATIC成员函数
 DWORD MyProc();
private:
 HANDLE m_hThread;
};

CTest::CTest()
:m_hThread(NULL)
{
 m_hThread = CreateThread(NULL, 0, ThreadCallback, (LPVOID)this, 0, NULL);  //注意把THIS指针当做PARAM传进去,没这个我们就不用玩了
 ASSERT(m_hThread);
}

CTest::~CTest()
{
 if(m_hThread)
 {
  TerminateThread(m_hThread, 1);
  m_hThread = NULL;
 }
}

static DWORD WINAPI CTest::ThreadCallback(PVOID pParam)
{
 ((CTest*)pParam)->ThreadProc();  //把pParam还原成指向当前对象的指针,然后曲线救国一下
}

DWORD CTest::MyProc()   //这个就是对象里的东西了,在里面可以为所欲为
{
 //do whatever you want
 //even visit the private member
}

如果在ThreadCallback函数里拿到this指针后,通过this指针去访问对象里的东西也是可以的,就不需要多一个MyProc函数了。但是MyProc可以直接引用所有成员变量,而ThreadCallback里每次都得用this->xxxx访问,多一次地址跳转,在效率上会比MyProc里直接调用稍低一些。所以还是推荐用上面代码的实现方式


本文转自Walzer博客园博客,原文链接:http://www.cnblogs.com/walzer/archive/2007/11/28/976252.html,如需转载请自行联系原作者


相关文章
|
4天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
22 4
|
6天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
18 4
|
25天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
28天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
25 4
|
28天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
20 4
|
28天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
19 1
|
1月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
45 6
|
1月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
22 0
C++ 多线程之线程管理函数
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
1月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)