由一个成员函数来启动一个线程

/*shows how to start a thread based on a

class memeber function using a static member function.*/

#define WIN32_LEAN_AND_MEAN

#include<stdio.h>

#include<stdlib.h>

#include<Windows.h>

#include<process.h>

typedef unsigned(WINAPI *PBEGINTHREADEX_THREADFUNC)(LPVOID lpThreadParameter);

typedef unsigned *PBEGINTHREADEX_THREADID;

/*this threadobject is created by a

thread that wants to start another thread.

All public member functions except ThreadFunc()

are called by that original thread.The virtual function

ThreadMemberFunc()is the start og the new thread.

*/

class ThreadObject

{

public:

ThreadObject();

void StartThread();

void WaitForExit();

static DWORD WINAPI ThreadFunc(LPVOID param);

protected:

virtual DWORD ThreadMemberFunc();

HANDLE m_hThread;

DWORD m_ThreadId;

};

ThreadObject::ThreadObject()

{

m_hThread = NULL;

m_ThreadId = 0;

}

void  ThreadObject::StartThread()

{

m_hThread = (HANDLE)_beginthreadex(NULL, 0,

(PBEGINTHREADEX_THREADFUNC)ThreadObject::ThreadFunc,

(LPVOID) this, 0, (PBEGINTHREADEX_THREADID)&m_ThreadId);

if (m_hThread)

printf("Thread lauched\n");

}

void ThreadObject::WaitForExit()

{

WaitForSingleObject(m_hThread, INFINITE);

CloseHandle(m_hThread);

}

//static member functions have no "this" pointer;

DWORD WINAPI ThreadObject::ThreadFunc(LPVOID param)

{

//Use the param as the address of the object

ThreadObject *pto = (ThreadObject*)param;

return pto->ThreadMemberFunc();

}

DWORD ThreadObject::ThreadMemberFunc()

{

//do something useful...

return 0;

}

void  main()

{

ThreadObject obj;

obj.StartThread();

obj.WaitForExit();

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-01 18:46:56

由一个成员函数来启动一个线程的相关文章

WORKDIR 指定工作目录 每一个 RUN 都是启动一个容器、执行命令、然后提交存储层文件变更

WORKDIR 指定工作目录 格式为 WORKDIR <工作目录路径>. 使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录. 之前提到一些初学者常犯的错误是把 Dockerfile 等同于 Shell 脚本来书写,这种错误的理解还可能会导致出现下面这样的错误: RUN cd /app RUN echo "hello" > world.txt 如果将这个 Dockerf

C++模板编程中只特化模板类的一个成员函数

模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数.类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1.2个成员函数即可.在这种情况下,如果全部重写该模板类的所有成员函数,不但会增加工作量,也不利于代码的维护. 例如下面的类模板A,只有在模板参数是char*时才需要特化成员函数func(),但其他的成员函数都不需要特化: 1 template <typename _Ty> 2 struct A 3 { 4 // 其他成员函数a 5 //

C++模板编程中只特化模板类的一个成员函数(花样特化一个成员函数)

转自:https://www.cnblogs.com/zhoug2020/p/6581477.html 模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数.类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1.2个成员函数即可.在这种情况下,如果全部重写该模板类的所有成员函数,不但会增加工作量,也不利于代码的维护. 例如下面的类模板A,只有在模板参数是char*时才需要特化成员函数func(),但其他的成员函数都不需要特化: 1 templ

成员函数指针与高性能的C++委托

成员函数指针与高性能的C++委托(上篇) 撰文:Don Clugston 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做"闭包(closure)"或"委托 (delegate)")在一些语言中已经证明了它宝贵的价值.在Delphi (Object Pascal)中,面向对象的函数指针是Borland可视化组建库(VCL,Visual Component Library)的基础.而在目前,C#使"委托&

c++ const 成员函数

第一个事实: 某类中可以这么声明定义两个函数,可以重载(overload) void pa(){ cout<<"a"<<endl; } void pa() const{ cout<<"b"<<endl; } 上面的写法是正确的. 基于这个事实,我思考了一下它的机制. 试验得出, 第二个事实: 普通函数(不是类的成员函数),可以这样来重载(overload): void fun(const int &a) { c

一个类成员函数的局部静态变量问题

之前工作中遇到一个问题,就像题目中描述的那样,看起来题目有些拗口复杂,这里解释下,当时遇到的需求需要这样处理:调用某个类对象的某个成员函数时,第一次有具体意义的,其他时候都是保持不变的.无意义的.这个需求可以看做是在调用某成员函数时,第一次进行初始化,其他时候不进行操作,即在首次调用时进行初始化,根据这点,很容易想到c/c++里面的static变量,它的作用是保持变量内容的持久,存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化.根据需求,使用static局部变量,写下

处理菱形继承问题&&实现一个虚函数的覆盖及调用&&实现以下几个类的成员函数

#include <iostream> #include <string> using namespace std; 1.实现以下几个类的成员函数 2.实现一个虚函数的覆盖及调用 3.处理菱形继承问题. 植物 class Botany { public: //(const string& name) // const char* name Botany(const char* name = "") :_name(name) //构造函数 { //cout

成员函数作为线程函数调用

遇到的问题 我们在编程中需要把数据封装成一个类,调用pthread_create 利用成员函数去创建一个线程往往是不成功的! error: argumentof type 'void* (Threadpool::)(void*)' does not match 'void* (*)(void*)' 出现类型不匹配的问题.因为pthread_create需要的参数类型为void*(*)(void*),而thread_rounter作为类的成员函数时其类型是void* (Threadpool::)(

Android实现开机自启动(二)——启动一个activity

在上一篇的基础上,我们收到了广播,现在我们想做点什么..比如启动一个服务,或者启动一个activity.以activity为例,下面聊一聊具体做法. 在onReceive方法里跳转到activity即可,需要注意的是在startActivity之前要setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 或者addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);两个是一个意思. 下面给代码 1 package com.example.testr