其实在signal中碰到过同样的问题,signal没办法使用类的成员函数,当时没能解决,不过今非昔比了,哈哈~~~
**************************************************************************************************
如果试图直接使用C++的成员函数作为回调函数将发生 错误,甚至编译就不能通过。其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数 从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员。由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题 的关键就是不让this指针起作用,通过采用以下两种典型技术可以解决在C++中使用回调函数所遇到的问题。这种方法具有通用性,适合于任何C++。
以上内容摘自:http://www.cnblogs.com/this-543273659/archive/2011/08/17/2143576.html
**************************************************************************************************
下面是一个简单的例子:
17 class TestThread
18 {
19 private:
20 struct ThreadParam
21 {
22 TestThread *myself_;
//其它地需要传入的参数
23 };
24 public:
25 void runThread();
26 private:
27 static void *threadFunction(void *threadParam);
28 int function();
29 };
30
31 void TestThread::runThread()
32 {
33 pthread_t thread;
34 ThreadParam threadParam;
35
36 //pass the this into threadFunction
37 threadParam.myself_ = this;
38 pthread_create(&thread , NULL , threadFunction,
39 (ThreadParam*)&threadParam);
40 sleep(1);
41 }
42
43 void *TestThread::threadFunction(void *threadParam)
44 {
45 ThreadParam *thread = (ThreadParam*)threadParam;
46 thread->myself_->function();
47 return NULL;
48 }
49
50 void TestThread::function()
51 {
52 cout<<“hello world”<<endl;
53 }
54
56 int main()
57 {
58 TestThread chenHuan;
59 chenHuan.runThread();
60 }
发表评论
要发表评论,您必须先登录。