• 大小: 46KB
    文件类型: .zip
    金币: 2
    下载: 1 次
    发布日期: 2021-06-23
  • 语言: C/C++
  • 标签: Thread  Pause  Resume  Stop  

资源简介

在使用线程时,最麻烦的就是线程的同步控制,如暂停、继续、停止(包括暂停状态下)等。虽然微软提供了 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

评论

共有 条评论