windows线程学习

windows线程学习
2010年09月01日
  线程(thread):是为了提高系统内程序的并发执行程度而提出来的概念,它是比进程更小的能够独立运行的基本单位。线程是一个轻量级实体(light-weight entity),它的结构(thread structure)相对简单,在切换速度上非常得快,同一进程中的线程切换不会引起进程的切换,对于并行计算来讲,有效的利用线程能够改善计算的效率,简化计算的复杂性。
  同一进程中的线程共享如下内容:
  全局变量
  堆数据
  打开的文件句柄
  用户及用户组ID
  但每个线程具有独立的:
  线程ID
  堆栈
  error变量
  优先级
  创建线程的方法与区别(针对C/C++/MFC)
  1、CreateThread( ) --WIN32 API函数
  2、_beginthreadex( ) --MS对C Runtime库的扩展SDK函数
  3、AfxBeginThread( ) --MFC中线程创建的MFC函数
  线程终止运行
  若要终止线程的运行,可以使用下面的方法:
  1、线程函数返回(最好使用这种方法)。
  2、通过调用ExitThread/_endthreadex /AfxEndThread函数,线程将自行撤消(最好不要使用这种方法)。
  3、同一个进程或另一个进程中的线程调用TerminateThread函数(应该避免使用这种方法)。
  4、包含线程的进程终止运行(应该避免使用这种方法)。
  一个线程类的示例: #pragma once class CThread { public: CThread(void); ~CThread(void); public: virtual BOOL Start(); //启动线程 virtual BOOL Stop(); //停止线程 virtual void Run(); //运行函数,线程反复调用 void EnableSleep(BOOL bEanble); //是否允许线程sleep virtual void OnThreadMsg(UINT message, WPARAM wParam, LPARAM lParam); //接收到消息 virtual void OnThreadStart(); //当线程启动时,调用一次 virtual void OnQuit(); //当线程结束时,调用一次 BOOL PostThreadMsg(UINT message, WPARAM wParam, LPARAM lParam); //向线程发送消息 BOOL IsStart(); //是否启动 private: CWinThread *m_pThread; static UINT ThreadProc(PVOID param); int m_nSleepTime; };
  // /// /// #include "StdAfx.h" #include "Thread.h" CThread::CThread(void) { m_nSleepTime = 1; m_pThread = NULL; } CThread::~CThread(void) { } BOOL CThread::IsStart() { return m_pThread != NULL; } BOOL CThread::Start() { m_pThread = AfxBeginThread(ThreadProc,this); return m_pThread != NULL; } BOOL CThread::PostThreadMsg(UINT message, WPARAM wParam, LPARAM lParam) { if( m_pThread ) { return m_pThread->PostThreadMessageW(message, wParam, lParam); } return FALSE; } BOOL CThread::Stop() { if( m_pThread ) { return m_pThread->PostThreadMessage(WM_QUIT,0,0); } return FALSE; } void CThread::OnThreadStart() { } void CThread::OnQuit() { m_pThread=NULL; } void CThread::OnThreadMsg(UINT message, WPARAM wParam, LPARAM lParam) { } void CThread::EnableSleep(BOOL bEanble) { if (bEanble) { m_nSleepTime = 1; } else { m_nSleepTime = 0; } } void CThread::Run() { } UINT CThread::ThreadProc(PVOID param) { CThread *pThread = (CThread*)param; pThread->OnThreadStart(); MSG msg; while(1) { while( PeekMessage(&msg,NULL,0,0,PM_REMOVE) ) { switch(msg.message) { case WM_QUIT: { pThread->OnQuit(); return 0; } default: { pThread->OnThreadMsg(msg.message,msg.wParam,msg.lPa ram); } continue; } } pThread->Run(); if( pThread->m_nSleepTime > 0 ) { Sleep(pThread->m_nSleepTime); } pThread->m_nSleepTime = 1; } return 0; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值