线程封装类(2)
来源:互联网 发布:如何判定论文数据造假 编辑:程序博客网 时间:2024/06/08 07:06
#define __THREAD_H__
#ifndef WIN32
#include <pthread.h>
#define T_CALLBACK
typedef pthread_t AIWHANDLE;
#else
#include <windows.h>
#define T_CALLBACK WINAPI
typedef HANDLE AIWHANDLE;
#endif
class CThreadX
{
public:
CThreadX(void);
virtual ~CThreadX(void);
virtual int Run();
bool StartThread();
bool Join();
bool Detach();
private:
static void* T_CALLBACK RunThread(void* pParam);
AIWHANDLE m_hThread;
void* m_pParam;
unsigned long m_nRet;
protected:
bool m_bStart;
int m_nState;
};
#endif
.cpp
#include "Thread.h"
CThreadX::CThreadX()
{
m_hThread = NULL;
m_pParam = NULL;
m_nRet = 0;
m_bStart = false;
m_nState = 0;
}
CThreadX::~CThreadX()
{
if (m_bStart && (m_nState == 0))
{
Join();
}
}
int CThreadX::Run()
{
return 0;
}
bool CThreadX::StartThread()
{
if (true == m_bStart)
return true;
bool bOK = true;
m_bStart = true;
#ifdef WIN32
if(NULL==(m_hThread=CreateThread(NULL,0, (unsigned long(T_CALLBACK*)(void*))&RunThread, this, 0, NULL)))
{
bOK = false;
}
#else
if (0 != pthread_create(&m_hThread, NULL, RunThread, this))
{
bOK = false;
}
#endif
if (!bOK)
{
m_bStart = false;
return false;
}
return true;
}
bool CThreadX::Join()
{
if (!m_bStart)
return false;
if (m_nState == 1)
return false;
bool ret;
m_bStart = false;
#ifdef WIN32
while (1)
{
if (FALSE == GetExitCodeThread(m_hThread, &m_nRet))
{
ret = false;
break;
}
else
{
if (m_nRet == STILL_ACTIVE)
{
Sleep(100);
continue;
}
CloseHandle(m_hThread);
ret = true;
break;
}
}
#else
ret = (0 == pthread_join(m_hThread, (void **)&m_nRet));
#endif
m_hThread = NULL;
return ret;
}
bool CThreadX::Detach()
{
if (!m_bStart)
return false;
if (m_nState == 1)
return false;
m_nState = 1;
#ifdef WIN32
return (TRUE == CloseHandle(m_hThread));
#else
return (0 == pthread_detach(m_hThread));
#endif
}
void* T_CALLBACK CThreadX::RunThread(void* pParam)
{
CThreadX* pThis = (CThreadX*)pParam;
int nRet = pThis->Run();
return (void *)nRet;
}
//#include <stdio.h>
//#include "Thread.h"
//
//class CTest : public CThreadX
//{
//public:
// int Run()
// {
// printf("1..\n");
// return 0;
// }
//};
//
//int main(int argc, char* argv[])
//{
// CTest a;
// a.Start();
//
// //a.Detach(); //分离线程
//
// if (false == a.Join())
// {
// printf("join failed!\n");
// }
//
// return 0;
//}
- 线程封装类(2)
- 线程类封装(2)
- 类封装线程(动态线程)
- 线程封装类(1)
- 介绍一个线程封装类(CThread)
- 线程封装类(3) win
- 线程类封装(1)
- 线程类封装(3)
- 线程类封装(4)
- 线程类封装(5)
- 一个线程封装类
- C++封装线程类
- 线程类基本封装
- C++封装POSIX 线程库(三)线程的封装
- 线程控制 - AfxBeginThreadUI线程的封装类
- 封装的线程注入类
- 封装线程类的方法
- 线程局部变量封装类
- 利用Handler.post(runnable)替代Thread来做周期循环的事情
- 堆/平衡树——Luogu1801 黑匣子_NOI导刊2010提高(06)
- NV_RESTORE宏的作用及清除的方法
- Android Splash 的最佳实践
- 从源码的角度分析,getWidth() 与 getMeasuredWidth() 的不同之处
- 线程封装类(2)
- Linux文件管理
- FileI/O
- Caffe中master与windows分支差异对比及通过命令提示符编译Caffe源码操作步骤
- 接口
- 《Java高并发程序设计》学习 --7.2 Akka之有关消息投递的一些说明
- bzoj4147
- PDF merge
- java中的类的执行顺序问题