四、AfxBeginThread
4.2 工作者线程
工作者线程类似我们之前介绍的用CreateThread创建的线程,它在后台处理数据,和主界面线程共享消息循环。它用AfxBeginThread的重载版本创建,函数原型如下:CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
pfnThreadProc —— 是我们的线程处理函数,它的定义类似
UINT __cdecl MyControllingFunction( LPVOID pParam )
pParam —— 我们在线程处理函数中传递的参数。
nPriority —— 设置线程的优先级,如果是0,设置的所有线程的优先级都一样,常见的优先级设置项参考下表:
| 标志 | 优先级值 |
|
1 | idle (最低) | THREAD_PRIORITY_IDLE | 如果进程优先级为realtime则调整为16,其它情况为1 |
2 | LOWEST 低 | THREAD_PRIORITY_LOWEST | -2(在原有基础上-2) |
3 | BELOW 低于标准 | THREAD_PRIORITY_BELOW_NORMAL | -1(在原有基础上-1) |
4 | NORMAL(标准) | THREAD_PRIORITY_NORMAL | 不变(取进程优先级值) |
5 | ABOVE 高于标准 | THREAD_PRIORITY_ABOVE_NORMAL | +1(在原有基础上+1) |
6 | HIGHEST (高) | THREAD_PRIORITY_HIGHEST | +2(在原有基础上+2) |
7 | CRITICAL(最高) | THREAD_PRIORITY_TIME_CRITICAL | 如果进程优先级为realtime则调整为31,其它情况为15 |
nStackSize —— 为线程分配的调用堆栈大小,0为默认值。
dwCreateFlags —— 设置线程创建后的初始状态。0,创建后立即执行;CREATE_SUSPENDED宏,创建后被挂起。
lpSecurityAttrs —— 线程的安全属性,默认为NULL。
返回值 —— AfxBeginThread()返回的是一个CWinThread类型的指针,这是MFC中封装的一个线程类型。在MFC多线程编程中,关于线程的任何操作都是通过该类完成。
介绍完创建工作者线程的AfxBeginThread原型之后,我们通过一个例子按照步骤介绍该函数的用法。
步骤一 创建主界面程序
我们新建一个主界面程序,在界面上添加一个编辑框,并给编辑框命名为m_num。步骤二 定义线程函数
我们定义一个线程函数,函数的功能是获取通过线程参数传过来的编辑框的指针,然后每隔1秒钟,在编辑框上刷新一个数字。UINT __cdecl MyControllingFunction( LPVOID pParam )
{
int index=0;
CEdit* pedt=(CEdit*)pParam;
while(1)
{
CString str;
str.Format("%d",index++);
pedt->SetWindowText(str);
Sleep(1000);
}
return 0;
}
步骤三 创建工作者线程
我们在主界面的OnInitDialog ()的函数中创建工作者线程,将编辑框m_num的地址通过线程参数传递给工作者线程。BOOL Cmfctest2Dlg::OnInitDialog()
{
…
AfxBeginThread(MyControllingFunction,&m_num);
return TRUE;
}
int CUIThread::ExitInstance()
{
m_udlg.DestroyWindow();
return CWinThread::ExitInstance();
}
运行程序,效果如下:
4.3 CWinThread类的几点用法
接下来,简单介绍下CWinThread的几点用法:CWinThread::SuspendThread —— 将已经激活的线程挂起。
CWinThread::ResumeThread —— 将挂起的线程重新激活
CWinThread::SetThreadPriority —— 设置线程的优先级
CWinThread::GetMainWnd —— 获取用户界面线程中的主界面地址
CWinThread::InitInstance —— 初始化用户界面线程中资源,创建用户界面线程是必须重载。
CWinThread::ExitInstance —— 释放用户界面线程中资源,创建用户界面线程是必须重载。
Github位置:
https://github.com/HymanLiuTS/NetDevelopment
克隆本项目:
git clonegit@github.com:HymanLiuTS/NetDevelopment.git
获取本文源代码:
git checkout NL45