网络编程(44)—— windows平台下创建线程的四种方法(三) 工作者线程和CWinThread线程类管理

版权声明:本文为博主原创文章,若转载请注明出处;若有错误,欢迎指出;若有问题,欢迎留言。 https://blog.csdn.net/lzhui1987/article/details/53834747

四、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



展开阅读全文

没有更多推荐了,返回首页