C++ 技术中心

   :: 首页 :: 联系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

郑重声明:本BLOG所发表的原创文章,作者保留一切权利。必须经过作者本人同意后方可转载,并注名作者(天空)和出处(CppBlog.com)。作者Email:coder@luckcoder.com

留言簿(27)

搜索

  •  

最新随笔

最新评论

评论排行榜

一.创建线程函数
     常用的创建线程的函数是CreateThread,还有MFC中的AfxBeginThread方法.另一种函数是_beginthreadex,
其实它在内部调用了CreateThread,在调用之前_beginthreadex做了很多的工作,从而使得它比CreateThread更
安全.所以一般使用_beginthreadex来创建线程.于是以下使用_beginthreadex函数来创建线程类.

二.线程类示例
1.Thread.h文件如下:
#ifndef _THREAD_H__
#define _THREAD_H__
#include 
<process.h>
#include 
<windows.h>

class CThread
{
public:
public:
    CThread();
    
virtual ~CThread();
    
    BOOL StartThread();   
//开始线程
    BOOL SuspendThread(); //挂起线程
    virtual BOOL Run();   //线程的入口
    BOOL StopThread();    //等待线程退出再返回
    
    
static unsigned __stdcall start_address( void * obj);

public:
    HANDLE m_hthread;        
//线程句柄
    HANDLE m_hEventSuspend;  //用于标识线程是工作,还是挂起状态
    BOOL m_status;           //线程状态,FALSE表示线程退出状态,TRUE表示未提出状态
    unsigned  m_thrdaddr;
}
;

#endif/*_THREAD_H__*/


2.Thread.cpp文件如下:
#include "Thread.h"


CThread::CThread()
{
    m_hEventSuspend 
= CreateEvent(0,TRUE,FALSE,NULL);//创建事件句柄,且为非激发状态
    m_status 
= TRUE;

    
//创建线程
    m_hthread = (HANDLE)_beginthreadex(NULL,0,CThread::start_address,this,0,&m_thrdaddr);
}


CThread::
~CThread()
{
    CloseHandle(m_hEventSuspend);
    CloseHandle( m_hthread );
}


BOOL CThread::StartThread()
{
    
return SetEvent(m_hEventSuspend);
}


BOOL CThread::SuspendThread()
{
    
return ResetEvent(m_hEventSuspend);
}


BOOL CThread::Run()
{
    
return TRUE;
}


BOOL CThread::StopThread()
{
    m_status 
= FALSE;//将线程状态置为退出
    StartThread();   //把线程唤醒,以免挂死在休眠处
    WaitForSingleObject(m_hthread,INFINITE); //等待线程退出

    
return TRUE;
}


unsigned __stdcall CThread::start_address( 
void * obj)
{
    CThread
* pthread = static_cast<CThread*>(obj);

    
while(pthread->m_status)
    
{
        WaitForSingleObject(pthread
->m_hEventSuspend,INFINITE);//控制挂起,运行
        
//如果自动退出
        if (!pthread->Run())
            
break;
    }

    _endthreadex(
0);

    
return 0;
}



三.线程类的使用
1. 新建一个win32控制台工程,代码如下:
#include "Thread.h"
#include 
<iostream>
#include 
<conio.h>


using namespace std;


class CMyThread:public CThread
{
public:
    BOOL Run()
    
{
        cout
<<"hello!"<<endl;
        Sleep(
5000);
        
return TRUE;
    }

}
;

int main(int argc,char *argv[])
{
    
//创建线程
    CMyThread mythread;

    
//让线程启动
    mythread.StartThread();
    
    
//按任意键,线程挂起
    _getch();
    mythread.SuspendThread();
    cout
<<"thread suspend"<<endl;

    
//接任意键,线程停止
    _getch();
    mythread.StopThread();
    cout
<<"thread stop"<<endl;

    
//按任意键,程序退出
    _getch();

    
return 0;
}



posted on 2011-03-11 14:45 C++技术中心 阅读(7486) 评论(7)  编辑 收藏 引用 所属分类: Windows 编程

Feedback

# re: 一个封装好的线程类[未登录] 2011-03-12 10:16 Lucifer
我觉得你应该把static unsigned __stdcall start_address( void * obj);设置为private的  回复  更多评论
  

# re: 一个封装好的线程类 2011-04-24 01:15 dongxu
如果线程需要传入参数时这个封装类比较难做到
可以改进一下
  回复  更多评论
  

# re: 一个封装好的线程类 2011-04-24 08:24 C++技术中心
@dongxu
你好,该类是封装好的类。如果自己的类需要拥用线程的特征,可以继承之。然后覆盖父类的virtual Run()函数。在里面实现你需要的功能。您如果需要传入任何对象或指针,可以在你继承的类中任何新增函数设置。  回复  更多评论
  

# re: 一个封装好的线程类 2013-09-30 17:57 岁月漫步
非常之好,收藏了  回复  更多评论
  

# re: 一个封装好的线程类 2014-09-02 23:32 abc
WaitForSingleObject(m_hthread,INFINITE); //等待线程退出

这里是不是写错了?不起作用的?
  回复  更多评论
  

# re: 一个封装好的线程类 2014-11-06 18:43 freelege
我觉得你的m_hEventSuspend最好改为m_hEventResume, 否则意思正好相反。  回复  更多评论
  

# re: 一个封装好的线程类 2015-08-27 10:21 Mis毛
使用了static,限制了其只能创建一个子线程,假若我想创建多个子线程怎么办?  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理