線程函數
阿新 • • 發佈:2018-05-28
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 virtualDWORD 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
線程函數