`

如何实现类的成员函数创建线程

 
阅读更多

一共有三种方法:

1
这种情况,一般是将线程函数申明为静态,:
class CRealtimeTask
{
public:
static UINT taskmain(LPVOID param);
BOOL StartTask();
};
在类中定义的成员函数,VC在编译时会强加一个this指针,所以才会出现上边的情况。将该成员函数声明为static类型,可以将this指针除去,但static成员函数只能访问static成员。

2
以将线程函数申明成友员函数,这样可以传入该类的指针,访问类的成员;
class CRealtimeTask
{
public:
friend UINT taskmain(LPVOID param);
BOOL StartTask();
};

UINT taskmain(LPVOID param)
{
CRealtimeTask * pTaskMain = (CRealtimeTask *) param;
//通过pTaskMain指针引用。
return TRUE;
}

BOOL CRealtimeTask::StartTask()
{
AfxBeginThread(taskmain,this);
}

3
可以对成员函数实现回调,并访问非静态成员的,如下所示,这是为了实现线程函数访问类成员而实现的类。比MFC的实现方法好象要好一点。

class base;

typedef int (base::*fnCallBack)(void *p);
struct callback(void *param;fnCallBack *pfuc;base *pThis;};

class base{
static int myThreadfuc(void *p){
struct callback *p1=(struct callback *)p;
base *pthis=p1->base;fnCallBack *pfuc=p1->pfuc;void *param=p1->param;
int i=(pthis->*pfuc)(param);delete p;
return i;

}
public:
void myCreateThread(fnCallBack pfuc,void *param){
struct callback *p=new struct callback;
p.param=param;p.pThis=this;p.pfuc=pfuc;
::CreateThread(myThreadfuc,p);

}
virtual int myCallBack(void *p){printf("It's base class./n");return 0;}
};
class derived:public base{
int myCallBack(void *p){printf("It's derived class/n");}
};
void myCreateThreadImitate(fnCallBack fuc,void *p)
{
(*fuc)(p);
}
void main()
{
base p;char *param;
p.myCreateThread(&(base::myCallBack),param);
derived p2;p2.myCreateThread(&(base::myCallBack),param);

}

分享到:
评论

相关推荐

    Delphi多线程教程

    如果用Windows API来创建线程的话,是通过一个叫做CreateThread的API函数来实现的,它的定义为: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_...

    MulThreadclass.rar_AfxBeginThread_cwinthread_多线程 同步

    线程间要处理好同步与通讯,如果用CWinThread好一点,直接是一个线程对象,如果用AfxBeginThread,那必须定个全局函数,或者写个静态函数,一般是传个this指针进去,然后再用这个指针调用本类函数的成员函数,...

    事件驱动多线程网络框架

    在epoll返回的时候Eventlooper会遍历可以操作的所有channel,并调用其成员函数handleEvent,该函数会判断events,也就是EPOLLIN EPOLLPRI等,并更具相应的需要去调用处理函数。 这里的Channel并不直接使用而是做...

    2017Java常考面试题 下载

    抽象类的成员函数可以是private,protected或者是public。 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。 也可以参考JDK8中抽象类和接口的区别 什么是...

    Python使用面向对象方式创建线程实现12306售票系统

    目前python 提供了几种多线程实现方式 thread,threading,multithreading ,其中thread模块比较底层,而threading模块是对thread做了一些包装,可以更加方便的被使用。 面向对象技术简介 类(Class): 用来描述具有...

    Visual C++开发经验技巧宝典(第1章)

    0070 如何用非静态的类成员函数作为线程函数 29 0071 如何在常量函数中修改数据成员 30 1.9 STL模板库 30 0072 为什么在程序中广泛使用STL 30 0073 如何在STL中使用容器 30 0074 STL算法的优点 31 0075...

    《Java和Android开发实战详解》第6到10章源代码-by 南邮-陈杨

    10.4.1 实现Runnable接口来创建线程 201 10.4.2 继承Thread类来创建线程 204 10.5 集合对象简介 205 10.5.1 Java Collections Framework 206 10.5.2 集合接口 206 10.5.3 泛型集合类概述 207 10.6 泛型...

    Visual.C#2010从入门到精通

    3.2.5 成员函数 32 3.2.6 静态成员 34 3.2.7 this指针 35 3.3 构造函数 37 3.3.1 使用构造函数的原因 37 3.3.2 构造函数的使用 37 3.3.3 重载构造函数 40 3.3.4 析构函数 41 3.4 继承 43 3.4.1 继承的概念 43 3.4.2 ...

    mfc教程(word版)

    13.2.3.3 CWnd的成员函数RepositionBars 262 13.2.4 工具条、状态栏和边框窗口的接口 265 13.2.4.1 应用程序在状态栏中显示信息 265 13.2.4.2 状态栏显示菜单项的提示信息 268 13.2.4.3 控制条的消息分发处理 270 ...

    MFC-李进九 电子书籍完整版

    13.2.3.3 CWnd的成员函数RepositionBars 262 13.2.4 工具条、状态栏和边框窗口的接口 265 13.2.4.1 应用程序在状态栏中显示信息 265 13.2.4.2 状态栏显示菜单项的提示信息 268 13.2.4.3 控制条的消息分发处理 270 ...

    网络编程实用教程(第三版).zip

    9.2.2 CHtmlView类的成员函数 251 9.2.3 创建一个Web浏览器型的应用程序的一般步骤 256 9.3 Web浏览器应用程序实例 261 9.3.1 程序实现的目标 261 9.3.2 创建实例程序 262 习题 265 实验 265 第 10章 ...

    上机实验-2 (1).doc

    EventQueue.invokeLater(new Runnable() {//使事件派发线程上的可运行对象排队。当可运行对象排在事件派发队列的队首时,就调用其run方法 public void run() { try { final Test1 frame = new Test1();//捕获...

    Java实现局域网内两点文件传输

    Java实现局域网内两点文件传输,接收端收到doc,docx,pdf类型的文件后自动调用虚拟打印机接口,实现打印pdf文件的功能。...6. Task 类的构造函数接收一个 Socket 对象,并将其赋值给成员变量 socket。 ......

    基于某JAVA地剪刀石头布游戏设计——Java课程设计报告材料-.doc

    通常有 两种方法来创建线程:其一,使用型构为Thread(Runnable) 的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出 子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是...

    Linux多线程服务端编程:使用muduo C++网络库

    1.1当析构函数遇到多线程. . . . . . . . . . . . . . . . .. . . . . . . . . . . 3 1.1.1线程安全的定义. . . . . . . . . . . . . . . . .. . . . . . . . . . . 4 1.1.2MutexLock 与MutexLockGuard. . . . . . ....

    基于JAVA的剪刀石头布游戏设计.docx

    通常有两种方法来创建线程:其一,使用型构为Thread(Runnable) 的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是...

    疯狂JAVA讲义

    第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 ...11.8.1 Image抽象类和BufferedImage实现类 425 11.8.2 使用ImageIO输入/输出位图 427 11.9 剪贴板 432 11.9.1 数据传递的类...

Global site tag (gtag.js) - Google Analytics