MFC线程和同步


    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
#endif
using 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"

// CMyThread

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



































你可能感兴趣的:(用户线程,工作者线程,MFC线程)