《ASCE1885的源码分析》の跨平台线程对象Thread封装基类
2010-09-11 20:00
375 查看
首先当然是先定义头文件Thread.h咯,如下:
#ifndef _THREAD_H
#define _THREAD_H
#ifdef _WIN32
#include <windows.h>
#else
#include <pthread.h>
#endif
#ifdef _WIN32
typedef unsigned threadfunc_t;
typedef void* threadparam_t;
#define STDPREFIX __stdcall
#else
typedef void* threadfunc_t;
typedef void* threadparam_t;
#define STDPREFIX
#endif
//线程的基类
class Thread
{
public:
Thread(bool release=true);
virtual ~Thread();
static threadfunc_t STDPREFIX StartThread(threadparam_t);
virtual void Run()=0; //纯虚函数,由派生类实现
#ifdef _WIN32
HANDLE GetThread(){return m_thread;}
unsigned GetThreadId(){return m_dwThreadId;}
#else
pthread_t GetThread(){return m_thread;}
#endif
bool IsRunning();
void SetRunning(bool x);
bool IsReleased();
void SetRelease(bool x);
bool DeleteOnExit();
void SetDeleteOnExit(bool x=true);
bool IsDestructor();
protected:
#ifdef _WIN32
HANDLE m_thread;
unsigned m_dwThreadId;
#else
pthread_t m_thread;
#endif
private:
Thread(const Thread&){}
Thread& operator=(const Thread&){return *this;}
bool m_running;
bool m_release;
bool m_b_delete_on_exit;
bool m_b_destructor;
};
#endif
接着是实现文件Thread.cpp,由于代码比较简单,就不多解释了,直接看代码里的注释就行了:
#include <stdio.h>
#ifdef _WIN32
#include <process.h>
#else
#include <unistd.h>
#endif
#include "Thread.h"
Thread::Thread(bool release)
:m_thread(0),
m_running(true),
m_release(false),
m_b_delete_on_exit(false),
m_b_destructor(false)
{
#ifdef _WIN32
m_thread = (HANDLE)_beginthreadex(NULL, 0, &StartThread,
this, 0, &m_dwThreadId);
#else
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if(pthread_create(&m_thread, &attr, StartThread, this) == 1)
{
perror("Thread:create failed");
SetRunning(false);
}
#endif
m_release = release;
}
Thread::~Thread()
{
m_b_destructor = true;
if(m_running)
{
SetRelease(true);
SetRunning(false);
#ifdef _WIN32
Sleep(1000);
#else
sleep(1);
#endif
}
#ifdef _WIN32
if(m_thread)
::CloseHandle(m_thread);
#endif
}
//线程函数
threadfunc_t STDPREFIX Thread::StartThread(threadparam_t zz)
{
Thread *p = (Thread*)zz;
while(p->m_running && !p->m_release)
{
#ifdef _WIN32
Sleep(1000);
#else
sleep(1);
#endif
}
if(p->m_running)
{
p->Run();
}
p->SetRunning(false); //Run()运行完了,或根本没运行
if(p->DeleteOnExit() && !p->IsDestructor())
{
delete p;
}
#ifdef _WIN32
_endthreadex(0);
#endif
return (threadfunc_t)NULL;
}
bool Thread::IsRunning()
{
return m_running;
}
void Thread::SetRunning(bool x)
{
m_running = x;
}
bool Thread::IsReleased()
{
return m_release;
}
void Thread::SetRelease(bool x)
{
m_release = x;
}
//退出时是否释放线程对象Thread*
bool Thread::DeleteOnExit()
{
return m_b_delete_on_exit;
}
void Thread::SetDeleteOnExit(bool x)
{
m_b_delete_on_exit = x;
}
//是否已经调用了析构函数
bool Thread::IsDestructor()
{
return m_b_destructor;
}
#ifndef _THREAD_H
#define _THREAD_H
#ifdef _WIN32
#include <windows.h>
#else
#include <pthread.h>
#endif
#ifdef _WIN32
typedef unsigned threadfunc_t;
typedef void* threadparam_t;
#define STDPREFIX __stdcall
#else
typedef void* threadfunc_t;
typedef void* threadparam_t;
#define STDPREFIX
#endif
//线程的基类
class Thread
{
public:
Thread(bool release=true);
virtual ~Thread();
static threadfunc_t STDPREFIX StartThread(threadparam_t);
virtual void Run()=0; //纯虚函数,由派生类实现
#ifdef _WIN32
HANDLE GetThread(){return m_thread;}
unsigned GetThreadId(){return m_dwThreadId;}
#else
pthread_t GetThread(){return m_thread;}
#endif
bool IsRunning();
void SetRunning(bool x);
bool IsReleased();
void SetRelease(bool x);
bool DeleteOnExit();
void SetDeleteOnExit(bool x=true);
bool IsDestructor();
protected:
#ifdef _WIN32
HANDLE m_thread;
unsigned m_dwThreadId;
#else
pthread_t m_thread;
#endif
private:
Thread(const Thread&){}
Thread& operator=(const Thread&){return *this;}
bool m_running;
bool m_release;
bool m_b_delete_on_exit;
bool m_b_destructor;
};
#endif
接着是实现文件Thread.cpp,由于代码比较简单,就不多解释了,直接看代码里的注释就行了:
#include <stdio.h>
#ifdef _WIN32
#include <process.h>
#else
#include <unistd.h>
#endif
#include "Thread.h"
Thread::Thread(bool release)
:m_thread(0),
m_running(true),
m_release(false),
m_b_delete_on_exit(false),
m_b_destructor(false)
{
#ifdef _WIN32
m_thread = (HANDLE)_beginthreadex(NULL, 0, &StartThread,
this, 0, &m_dwThreadId);
#else
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if(pthread_create(&m_thread, &attr, StartThread, this) == 1)
{
perror("Thread:create failed");
SetRunning(false);
}
#endif
m_release = release;
}
Thread::~Thread()
{
m_b_destructor = true;
if(m_running)
{
SetRelease(true);
SetRunning(false);
#ifdef _WIN32
Sleep(1000);
#else
sleep(1);
#endif
}
#ifdef _WIN32
if(m_thread)
::CloseHandle(m_thread);
#endif
}
//线程函数
threadfunc_t STDPREFIX Thread::StartThread(threadparam_t zz)
{
Thread *p = (Thread*)zz;
while(p->m_running && !p->m_release)
{
#ifdef _WIN32
Sleep(1000);
#else
sleep(1);
#endif
}
if(p->m_running)
{
p->Run();
}
p->SetRunning(false); //Run()运行完了,或根本没运行
if(p->DeleteOnExit() && !p->IsDestructor())
{
delete p;
}
#ifdef _WIN32
_endthreadex(0);
#endif
return (threadfunc_t)NULL;
}
bool Thread::IsRunning()
{
return m_running;
}
void Thread::SetRunning(bool x)
{
m_running = x;
}
bool Thread::IsReleased()
{
return m_release;
}
void Thread::SetRelease(bool x)
{
m_release = x;
}
//退出时是否释放线程对象Thread*
bool Thread::DeleteOnExit()
{
return m_b_delete_on_exit;
}
void Thread::SetDeleteOnExit(bool x)
{
m_b_delete_on_exit = x;
}
//是否已经调用了析构函数
bool Thread::IsDestructor()
{
return m_b_destructor;
}
相关文章推荐
- 《ASCE1885的源码分析》の跨平台线程对象Thread封装基类
- Java 线程 Thread 对象锁的wait和notify解析
- Java线程:线程的同步与锁 一、同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。 例如:两个线程ThreadA、ThreadB都操作同一个对象Foo对
- Thread学习(三)多个线程访问共享对象和数据的方式
- 封装多媒体定时器类和时间核心对象线程类
- 线程封装组件(BackgroundWorker)和线程(Thread)
- 工厂模式:封装对象的创建(一、在基类中定义一个静态成员函数)
- Java 线程 Thread 对象锁的wait和notify解析
- 跨平台开发连载(2_线程基类)
- Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
- 结合 异常捕获体系的 线程基类封装 (一)
- java线程研究---(1)建立Thread和产生线程对象
- 在不是Thread类的子类中,如何获取线程对象的名称呢?
- 线程封装组件(BackgroundWorker)和线程(Thread)
- 结合 异常捕获体系的 线程基类封装 (二)
- AfxBeginThread创建和事件对象结束线程的方法
- WPF中使用Free解决访问非UI线程创建的对象抛出的Thread异常
- 结合 异常捕获体系的 线程基类封装 (三)
- 线程封装组件(BackgroundWorker)和线程(Thread)
- 线程封装组件(BackgroundWorker)和线程(Thread)