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
事件对象 --内核对象 分收工重置对象和自动重置对象