MFC线程和同步

来源:互联网 发布:大数据 视频 编辑:程序博客网 时间:2024/05/19 20:59

    1 MFC线程分类

        1.1 工作者线程 - 在后台执行,不需要用户界面
        1.2 用户线程 - 提供了用户界面,可以与用户交互


    2 MFC线程相关

        2.1 线程创建和结束
AfxBeginThread - 创建线程
AfxEndThread - 结束线程
        2.2 CWinThread类 - 线程类,父类是CCmdTarget
        2.3 同步类
CCriticalSection - 临界区
CEvent - 事件
CMutex - 互斥量
CSemaphone - 信号量
父类都是CSyncObject类,都是通过Lock/Unlock函数等候/释放同步操作


    3 工作者线程的使用

        3.1 线程函数的定义

线程函数原型
UINT ThreadProc (LPVOID pVoid)

        3.2 线程的创建

CWinThread* AfxBeginThread(
      AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
pfnThreadProc - 线程处理函数
pParam - 线程参数
nPriority - 线程优先级别,使用默认值
nStackSize - 线程堆栈,0使用缺省
dwCreateFlags - 创建标识,0创建后立即执行
lpSecurityAttrs  - 安全属性
返回值CWinThread指针,封装了线程处理的一些函数


    4 用户线程的使用

        4.1 定义线程类

基于CWinThread派生子类

        4.2 在线程类中添加窗口

在子类Initinstance中创建并显示窗口,并将窗口指定为线程主窗口

        4.3 创建线程

AfxBeginThread()创建线程
CWinThread* AfxBeginThread(
      CRuntimeClass* pThreadClass,   
     int nPriority = THREAD_PRIORITY_NORMAL,
     UINT nStackSize = 0,
     DWORD dwCreateFlags = 0,
     LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
    );
pThreadClass - CWinThread派生子类的运行时类信息

        4.4 与工作者线程的对比

4.4.1 在现象上可以添加用户界面

4.4.2 在线程内部,增加自己的消息循环机制


工作者线程示例代码

// WorkThread.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "WorkThread.h"#ifdef _DEBUG#define new DEBUG_NEW#endifusing namespace std;//线程函数UINT AFX_CDECL ThreadProc(LPVOID){while (1){printf("WorkThread------\n");Sleep(1000);}return 0;}int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){int nRetCode = 0;//创建线程CWinThread* pThread;pThread = AfxBeginThread(ThreadProc,NULL);system("pause");//结束线程TerminateThread(pThread->m_hThread, 0);return nRetCode;}

用户线程示例代码

定义自己的线程类,继承CWinThread

#pragma once#include "TestDlg.h"// CMyThreadclass CMyThread : public CWinThread{DECLARE_DYNCREATE(CMyThread)protected:CMyThread();           // 动态创建所使用的受保护的构造函数virtual ~CMyThread();public:virtual BOOL InitInstance();virtual int ExitInstance();protected:DECLARE_MESSAGE_MAP()};


 在线程类中添加窗口

在子类Initinstance中创建并显示窗口,并将窗口指定为线程主窗口

BOOL CMyThread::InitInstance(){// TODO: 在此执行任意逐线程初始化CTestDlg dlg;m_pMainWnd = &dlg;dlg.DoModal();return TRUE;}

创建线程


//创建用户线程CMyThread* myThread = (CMyThread*)AfxBeginThread(RUNTIME_CLASS(CMyThread));



































0 0
原创粉丝点击