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