c++中,类成员函数作为线程函数 。网上的一段代码研究

这段代码可以运行。使用非静态方法后,传入的this指针没有使用,非传入的this对象调用自己的成员函数。!!!!

 

#include "stdafx.h"
#include <stdio.h>
#include <process.h>

class TMyClass {
    int m_nCount;
    int m_nId;
public:
    TMyClass(int nId, int nCount)
        :m_nId(nId), m_nCount(nCount)
    {
        m_nId = nId;
        m_nCount = nCount;

    }
    //感觉有问题,传入的this指针没有使用。这个从表面来看用了非静态方法,其实意义不大。
    void ThreadProc()            // 类成员方法
    {
        for (int i = 0; i < m_nCount; i++)      // 根据m_nCount成员打印一排数字
        {
            printf("Class%d : %d\n", m_nId, i);
        }
    }
};

int main(int argc, char* argv[])
{
    union {                                // 联合类,用于转换类成员方法指针到普通函数指针(试过编译器不允许在这两种函数之间强制转换),不知道有没有更好的方法。
        void ( *ThreadProc)(void *);
        void ( TMyClass::*MemberProc)();
    } Proc;                                // 尽管联合里的两种函数类型现在看起来有很大不同,但它们的最终形式是相同的。

    TMyClass MyClass1(1, 10), MyClass2(2, 5); // 产生两个TMyClass对象

    Proc.MemberProc = &TMyClass::ThreadProc;  // 转换,Proc.ThreadProc就是对应的普通函数指针了

    _beginthread(Proc.ThreadProc, 4096, &MyClass1);  // 开始线程,这里的Proc.ThreadProc实际上是TMyClass::ThreadProc, 它要的this指针是我们给的&MyClass1。
    //_beginthread(Proc.ThreadProc, 4096, &MyClass2);
    system("pause");
    return 0;
}

 

#include "stdafx.h"#include <stdio.h>#include <process.h>
class TMyClass {int m_nCount;int m_nId;public:TMyClass(int nId, int nCount):m_nId(nId), m_nCount(nCount){m_nId = nId;m_nCount = nCount;
}//感觉有问题,传入的this指针没有使用。这个从表面来看用了非静态方法,其实意义不大。void ThreadProc()            // 类成员方法{for (int i = 0; i < m_nCount; i++)      // 根据m_nCount成员打印一排数字{printf("Class%d : %d\n", m_nId, i);}}};
int main(int argc, char* argv[]){union {                                // 联合类,用于转换类成员方法指针到普通函数指针(试过编译器不允许在这两种函数之间强制转换),不知道有没有更好的方法。void ( *ThreadProc)(void *);void ( TMyClass::*MemberProc)();} Proc;                                // 尽管联合里的两种函数类型现在看起来有很大不同,但它们的最终形式是相同的。
TMyClass MyClass1(1, 10), MyClass2(2, 5); // 产生两个TMyClass对象
Proc.MemberProc = &TMyClass::ThreadProc;  // 转换,Proc.ThreadProc就是对应的普通函数指针了
_beginthread(Proc.ThreadProc, 4096, &MyClass1);  // 开始线程,这里的Proc.ThreadProc实际上是TMyClass::ThreadProc, 它要的this指针是我们给的&MyClass1。//_beginthread(Proc.ThreadProc, 4096, &MyClass2);system("pause");return 0;}

 

posted @ 2016-07-27 13:53  知吾猪  阅读(2325)  评论(0编辑  收藏  举报