资源简介
在使用线程时,最麻烦的就是线程的同步控制,如暂停、继续、停止(包括暂停状态下)等。虽然微软提供了 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语言编程
相关资源
- 高性能服务器代码(50_06th_server_thre
- MultiThread(VS2013 MFC多线程-含源码-含个
- C++ > (开源) Ring3下的DLL注入工具
- Intel TBB Library
- 基于VS2010MFC平台使用C++编写的上位机
- c++基础封装线程、锁、定时器、原子
- linux下c语言实现多线程web服务器
- MFC中的多线程同步
- Pthread 多线程C++动态库+静态库+头文件
- VS编译时无法打开 源 文件 \“pthread
- [野火]《RT-Thread 内核实现与应用开发
- rtthread工程模板
- c语言实现一个简单的线程池(thread
- windows 线程池(ThreadPoolMain.cpp)
- MFC多线程编程
- 基于Socket的简单的2人对打游戏源代码
- 嵌入式实时操作系统的多线程计算-
评论
共有 条评论