博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MFC线程和同步
阅读量:3986 次
发布时间:2019-05-24

本文共 2178 字,大约阅读时间需要 7 分钟。

    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));

转载地址:http://ewxui.baihongyu.com/

你可能感兴趣的文章
GitHub 万星推荐:黑客成长技术清单
查看>>
可以在线C++编译的工具站点
查看>>
关于无人驾驶的过去、现在以及未来,看这篇文章就够了!
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
Web开发之路
查看>>
昨夜今晨最大八卦终于坐实——人类首次直接探测到了引力波
查看>>
年纪轻轻记忆力就衰退得厉害,我还有救吗?
查看>>
如何优雅、机智地和新公司谈薪水?
查看>>
为什么读了很多书,却学不到什么东西?
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
关于WebClient超时问题
查看>>
创业公司如何与巨头竞争?利用好这9大优势是关键
查看>>
读书 | 如何像沉迷游戏一样对工作上瘾?
查看>>
如何确保自己的Mac数据安全呢?这里有四个“小秘诀”
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
第一性原理:戳中问题本质的人是怎么思考的?
查看>>
No.147 - LeetCode1108
查看>>
No.148 - LeetCode771
查看>>
No.172 - LeetCode1301
查看>>
No.173 - LeetCode1304
查看>>