1. 程式人生 > >線程函數

線程函數

ons express err RF virtual nap ORC 代碼 typedef

CBaseThread類

BaseThread.h

 1 // BaseThread.h: interface for the CBaseThread class.
 2 //
 3 //////////////////////////////////////////////////////////////////////
 4 
 5 #if !defined(AFX_ADTHREAD_H__B8BA8873_31BA_4CDE_9BC2_45AD6FCDA5BD__INCLUDED_)  //#if !defined  防止重復定義
 6 #define AFX_ADTHREAD_H__B8BA8873_31BA_4CDE_9BC2_45AD6FCDA5BD__INCLUDED_ 
 7 
 8 #if _MSC_VER > 1000
 9
#pragma once //只要在頭文件的最開始加入這條雜註,就能夠保證頭文件只被編譯一次 10 #endif // _MSC_VER > 1000 11 12 #include "BaseCallBack.h" 13 14 class CBaseThread 15 { 16 public: 17 18 CBaseThread(); 19 virtual ~CBaseThread(); // 在實現多態時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。 20 DWORD Start(DWORD dwCreationFlags = 0); 21 virtual
DWORD Stop(WORD timeout, BOOL bForceKill = FALSE); 22 DWORD Suspend(); 23 DWORD Resume(); 24 BOOL SetPriority(int nPriority); 25 int GetPriority(); 26 27 void SetICallBack(CBaseCallBack* pCallBack) //函數指針 指向函數的首地址 28 { 29 this->m_pCallBack = pCallBack; //改變指向類的指針的指向
30 } 31 BOOL GetThreadRunState() const {return m_bRunThread;} 32 33 DWORD GetStartTime(){return m_dwStartTime;} 34 void ResetStartTime(){m_dwStartTime = GetTickCount();} 35 void SetStatisticalTime(DWORD dwTimeLen){m_dwStatisticalTime = dwTimeLen;} 36 DWORD GetStatisticalTime(){return m_dwStatisticalTime;} 37 38 protected: 39 virtual DWORD ThreadMethod() = 0; //純虛函數 40 41 private: 42 static DWORD WINAPI ThreadFunc( LPVOID pParam); 43 44 public: 45 HANDLE m_hThread; //線程句柄 46 DWORD m_dwTID; //線程ID 47 DWORD m_dwExitCode; //線程退出碼 48 49 DWORD m_dwStartTime; 50 DWORD m_dwStatisticalTime; 51 52 protected: 53 LPTHREAD_START_ROUTINE m_pThreadFunction; //工作線程指針 54 BOOL m_bRunThread; //線程是否繼續運行的標誌 55 CBaseCallBack *m_pCallBack; //指向類的指針 56 57 }; 58 59 #endif // !defined(AFX_ADTHREAD_H__B8BA8873_31BA_4CDE_9BC2_45AD6FCDA5BD__INCLUDED_)

BaseThread.cpp

  1 // ADThread.cpp: implementation of the CBaseThread class.
  2 //
  3 //////////////////////////////////////////////////////////////////////
  4 
  5 #include "stdafx.h"
  6 #include "BaseThread.h"
  7 
  8 #ifdef _DEBUG
  9 #undef THIS_FILE
 10 static char THIS_FILE[]=__FILE__;
 11 #define new DEBUG_NEW
 12 #endif
 13 
 14 //////////////////////////////////////////////////////////////////////
 15 // Construction/Destruction
 16 //////////////////////////////////////////////////////////////////////
 17 
 18 CBaseThread::CBaseThread()
 19 {
 20     m_pThreadFunction = CBaseThread::ThreadFunc;
 21     m_bRunThread = FALSE;
 22     m_hThread = NULL;
 23 }
 24 
 25 CBaseThread::~CBaseThread()
 26 {
 27     if (m_hThread != NULL)
 28     {
 29         Stop(1000, true); 
 30     }
 31 }
 32 
 33 DWORD CBaseThread::Start(DWORD dwCreationFlags)         //線程開始
 34 {
 35     m_bRunThread = true;
 36     m_hThread = CreateThread(NULL, 0, m_pThreadFunction, this, dwCreationFlags, &m_dwTID);  //創建線程
 37 
 38     m_dwExitCode = (DWORD)-1;
 39 
 40     ResetStartTime();
 41 
 42     return GetLastError();
 43 }
 44 /************************************************************************/
 45 /* 功能:停止線程
 46 /* 參數:bForceKill,若TRUE,強制立即結束,否則,溫柔結束   
 47          timeout:為等待時間,一毫秒記                                                       
 48 /************************************************************************/
 49 DWORD CBaseThread::Stop(WORD timeout, BOOL bForceKill)    //線程停止
 50 {
 51     if (m_hThread != NULL)
 52     {
 53         //嘗試"溫柔地"結束線程 
 54         if (m_bRunThread)
 55         {
 56             m_bRunThread = FALSE;
 57             WaitForSingleObject(m_hThread, timeout); //WaitForSingleObject()在某一線程中調用該函數時,線程暫時掛起,如果在掛起的dwMilliseconds毫秒內,線程所等待的對象變為有信號狀態,則該函數立即返回;如果超時時間已經到達dwMilliseconds毫秒,但hHandle所指向的對象還沒有變成有信號狀態,函數照樣返回。
 58         }
 59         
 60         GetExitCodeThread(m_hThread, &m_dwExitCode);  //獲取一個已中止線程的退出代碼
 61         
 62         if (m_dwExitCode == STILL_ACTIVE && bForceKill)
 63         {    
 64             //強制殺死線程
 65             TerminateThread(m_hThread, DWORD(-1));  //在線程外終止一個線程,用於強制終止線程 DWORD dwExitCode 退出碼
 66             m_hThread = NULL;
 67         }
 68     }
 69 
 70     return m_dwExitCode;
 71 }
 72 
 73 /************************************************************************/
 74 /*功能:掛起線程
 75 /************************************************************************/
 76 
 77 DWORD CBaseThread::Suspend()
 78 {
 79     return SuspendThread(m_hThread);
 80 }
 81 
 82 /************************************************************************/
 83 /*功能:恢復線程 
 84 /************************************************************************/
 85 DWORD CBaseThread::Resume()
 86 {
 87     return ResumeThread(m_hThread);
 88 }
 89 
 90 /************************************************************************/
 91 /*功能:設置線程優先級 
 92 /*參數:priority:查看SetThreadPriority() in windows sdk,其可能取值。
 93 /************************************************************************/
 94 BOOL CBaseThread::SetPriority(int nPriority)
 95 {
 96     return SetThreadPriority(m_hThread, nPriority);
 97 }
 98 
 99 /************************************************************************/
100 /* 功能:獲得線程優先級
101 /************************************************************************/
102 int CBaseThread::GetPriority()
103 {
104     return GetThreadPriority(m_hThread);
105 }
106 
107 /************************************************************************/
108 /* 功能:靜態線程函數, 調用實際的工作函數ThreadMethod()
109 /* 參數:pParam:在需要啟用該線程函數的子類實例中,將this傳給線程函數,以便線程函數可以訪問該實例的成員。                                                                
110 /************************************************************************/
111 DWORD WINAPI CBaseThread::ThreadFunc(LPVOID pParam)
112 {
113     CBaseThread *pParent = reinterpret_cast<CBaseThread*>(pParam); //reinterpret_cast<type-id> (expression)強制類型轉換符
114                                                                     //type-id 必須是一個指針、引用、算術類型、函數指針或者成員指針
115     pParent->ThreadMethod();    //多態性,調用子類的實際工作函數
116     return 0;
117 }

BaseCallBack.h

 1 // BaseCallBack.h: interface for the CBaseCallBack class.
 2 //
 3 //////////////////////////////////////////////////////////////////////
 4 
 5 #ifndef _BASECALLBACK_H_
 6 #define _BASECALLBACK_H_
 7 
 8 typedef short I16;
 9 
10 class CBaseCallBack   
11 {
12 public:
13     virtual ~CBaseCallBack(){}
14     virtual void CallBackMethod(short *psiBuf, DWORD dwSize) = 0;
15     virtual void CallBackMethod() = 0;
16     virtual void CallBackMethod(WPARAM wPara){;}
17 };
18 
19 #endif

線程函數