資源簡介
在使用線程時,最麻煩的就是線程的同步控制,如暫停、繼續、停止(包括暫停狀態下)等。雖然微軟提供了 SuspendThread、TerminateThread 等函數“似乎”可以完成這個功能,但如果你在代碼里使用這些函數,則往往會遇到各種問題(比如SuspendThread時正好在CRT分配內存的鎖中造成其他線程也跟著鎖死,TerminateThread時資源未釋放)等。
本人經過試驗和總結,整理出可以安全的進行暫停、繼續、停止線程執行的一個線程類,能非常方便的對線程進行控制。
附件里是源碼和Sample程序,并有詳細的使用說明。

代碼片段和文件信息
#include?“stdafx.h“
#include?“ftlthread.h“
namespace?FTL
{
????CFEventChecker::CFEventChecker(HANDLE?hEventStopHANDLE?hEventContinue)
????{
????????m_hEventStop?=?hEventStop;
????????m_hEventContinue?=?hEventContinue;
????????_ASSERT(m_hEventStop);
????????_ASSERT(m_hEventContinue);
????}
????CFEventChecker::~CFEventChecker()
????{
????????m_hEventStop?=?NULL;
????????m_hEventContinue?=?NULL;
????}
????FTLThreadWaitType?CFEventChecker::GetWaitType(DWORD?dwTimeOut?/*?=?INFINITE?*/)
????{
????????HANDLE?waitEvent[]?=?
????????{
????????????{m_hEventStop}
????????????{m_hEventContinue}
????????};
????????FTLThreadWaitType?waitType?=?ftwtError;
????????DWORD?dwResult?=?WaitForMultipleobjects(sizeof(waitEvent)/sizeof(waitEvent[0])waitEventFALSEdwTimeOut);
????????switch(dwResult)
????????{
????????case?WAIT_object_0:?//?stop
????????????waitType?=?ftwtStop;
????????????break;
????????case?WAIT_object_0?+?1:?//continue
????????????waitType?=?ftwtContinue;
????????????break;
????????case?WAIT_TIMEOUT:
????????????waitType?=?ftwtTimeOut;
????????????break;
????????default:
????????????//FTLTRACEEX(tlError_T(“CFEventChecker::GetWaitType?Error!!!\r\n“));
????????????waitType?=?ftwtError;
????????????_ASSERT(FALSE);
????????????break;
????????}
????????return?waitType;
????}
????FTLThreadWaitType?CFEventChecker::SleepAndCheckStop(DWORD?dwTimeOut)
????{
????????FTLThreadWaitType?waitType?=?ftwtError;
????????DWORD?dwResult?=?WaitForSingleobject(m_hEventStopdwTimeOut);
????????switch?(dwResult)
????????{
????????case?WAIT_object_0:?//Stop
????????????waitType?=?ftwtStop;
????????????break;
????????case?WAIT_TIMEOUT:
????????????waitType?=?ftwtTimeOut;
????????????break;
????????default:??//how?can?come?here??
????????????waitType?=?ftwtError;
????????????break;
????????}
????????return?waitType;
????}
????CFThread::CFThread(HANDLE?hEventStop/*?=?NULL*/HANDLE?hEventContinue/*?=?NULL*/)
????{
????????m_hThread =?NULL;
????????if?(NULL?==?hEventStop)
????????{
????????????m_hEventStop =?::CreateEvent(NULLTRUEFALSENULL);
????????????m_bCreateEventStop?=?TRUE;
????????}
????????else
????????{
????????????m_hEventStop?=?hEventStop;
????????????m_bCreateEventStop?=?FALSE;
????????}
????????if?(NULL?==?hEventContinue)
????????{
????????????m_hEventContinue?=?::CreateEvent(NULLTRUETRUENULL);
????????????m_bCreateEventContinue?=?TRUE;
????????}
????????else
????????{
????????????m_hEventContinue?=?hEventContinue;
????????????m_bCreateEventContinue?=?FALSE;
????????}
????????m_pEventChecker?=?new?CFEventChecker(m_hEventStop?m_hEventContinue);
????}
????CFThread::~CFThread()
????{
????????BOOL?bRet?=?FALSE;
????????if(?IsThreadRunning())
????????{
????????????_ASSERT(!_T(“Please?Stop?Thread?Before?App?Exit“));
????????????API_VERIFY(StopAndWait(FTL_MAX_THREAD_DEADLINE_CHECKTRUE));
????????}
????????SAFE_DELETE(m_pEventChecker);
????????if?(m
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2012-04-04?16:01??FtlThreadDemo\
?????文件????????1343??2012-04-04?15:25??FtlThreadDemo\ftlFake.h
?????文件????????7701??2012-04-04?15:34??FtlThreadDemo\ftlThread.cpp
?????文件????????2902??2012-04-04?15:34??FtlThreadDemo\ftlThread.h
?????文件????????1949??2012-04-04?15:08??FtlThreadDemo\FtlThreadDemo.cpp
?????文件?????????544??2012-04-04?15:08??FtlThreadDemo\FtlThreadDemo.h
?????文件????????5842??2012-04-04?15:38??FtlThreadDemo\FtlThreadDemo.rc
?????文件?????????915??2012-04-04?15:08??FtlThreadDemo\FtlThreadDemo.sln
?????文件???????11264??2012-04-04?16:01??FtlThreadDemo\FtlThreadDemo.suo
?????文件????????5086??2012-04-04?15:38??FtlThreadDemo\FtlThreadDemo.vcproj
?????文件????????5365??2012-04-04?15:50??FtlThreadDemo\FtlThreadDemoDlg.cpp
?????文件????????1045??2012-04-04?15:48??FtlThreadDemo\FtlThreadDemoDlg.h
?????文件?????????983??2012-04-04?15:58??FtlThreadDemo\MyThreadDemo.cpp
?????文件?????????284??2012-04-04?15:39??FtlThreadDemo\MyThreadDemo.h
?????文件????????4342??2012-04-04?15:08??FtlThreadDemo\ReadMe.txt
?????目錄???????????0??2012-04-04?16:01??FtlThreadDemo\Release\
?????文件???????49152??2012-04-04?16:01??FtlThreadDemo\Release\FtlThreadDemo.exe
?????目錄???????????0??2012-04-04?15:08??FtlThreadDemo\res\
?????文件???????21630??2001-04-19?23:48??FtlThreadDemo\res\FtlThreadDemo.ico
?????文件?????????703??2012-04-04?15:08??FtlThreadDemo\res\FtlThreadDemo.manifest
?????文件?????????404??2012-04-04?15:08??FtlThreadDemo\res\FtlThreadDemo.rc2
?????文件?????????869??2012-04-04?15:38??FtlThreadDemo\resource.h
?????文件?????????213??2012-04-04?15:08??FtlThreadDemo\stdafx.cpp
?????文件????????1864??2012-04-04?15:08??FtlThreadDemo\stdafx.h
- 上一篇:DAC0832輸出正弦波,C語言實現
- 下一篇:rbf神經網絡c語言編程
評論
共有 條評論