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; }
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; }