mfc下多线程编程

1.mfc支持两种线程
   用户界面线程
   工作线程
2.mfc中所有线程都是由CWinThread对象表示
    CWinThread是用户接口线程的基类, CWinApp就是从CWinThread派生出来的
    在写用户接口线程时, 也要从CWinThread类派生出自己的线程类
    可以调用AfxBeginThread函数, 会创建CWinThread对象
3.编写是想工作线程的控制函数, 控制函数的原型:
    UINT ControlFunctionName(LPVOID pParam); //线程回调
4.线程调用AfxBeginThread函数就可以创建新的线程
5.创建并启动工作线程:
    CWinThread* AfxBeginThread(
        AFX_THREADPROC pfnThreadProc,
        LPVOID pParam,
        int nPriority = THREAD_PRIORITY_NORMAL,
        UINT nStackSize = 0,
        WORD dwCreateFlags = 0,
        LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
6.AfxEndThread终止线程
7.创建用户界面线程
    从CWinThread类派生出自己的线程类
    改造这个类
    启动用户界面
8.基类的一些成员函数:
    ExitInstance, 当线程退出是, 会调用执行清理工作
    InitInstance, 执行线程类实例初始化, 子类必须重写
    OnIdle, 执行线程特定空闲时间处理
    PreTranslateMessage, 过滤消息
    Run, 执行线程函数
9.AfxBeginThread函数的另一个重载原型:(界面线程)
    CWinThread* AfxBeginThread(
        CRuntimeClass* pThreadClass,  //用RUNTIME_CLASS宏将线程类指针转换为指向CRuntimeClass对象指针
        int nPriority = THREAD_PRIORITY_NORMAL,
        UINT nStackSize = 0;
        DWORD dwCreateFlags = 0,
        LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
    );
10.终止线程
    正常终止线程 VOID PostQuitMessage(int nExitCode);
    提前终止线程 在线程内调用AfxEndThread函数 VOID AfxEndThread(UINT nExitCode);
11.线程同步技术
    信号量 --限制使用共享资源的线程数目
        CSemaphore g_Sem(5, 5); 时间内最多只有5个线程能共享资源, 还初始开始时没有线程获得信号资源
            一旦线程访问共享资源, 信号量计数器就减1, 若变为0, 则下来对资源的访问就会被拒绝, 知道持有的资源线程释放了资源的持有权
    互斥对象 --内核对象
    临界区 --用户模式对象 弄不好就容易出现死锁, 不过用起来很简单, 只有4个API
        InitializeCriticalSection, EterCreiticalSection, LeveCriticalSection, DeleteCriticalSection
    事件对象 --内核对象 分收工重置对象和自动重置对象