MFC线程处理概述

简介:       事实上,Win32 API提供了_beginthreadex函数,可以让用户在底层启动线程。总地来说,Win32 API提供的线程处理的接口,引用较为复杂。

      事实上,Win32 API提供了_beginthreadex函数,可以让用户在底层启动线程。总地来说,Win32 API提供的线程处理的接口,引用较为复杂。因此,在Win32 API的基础上,MFC提供了处理线程的类和函数。其中,MFC提供处理线程的类为CWinThread类。CWinThread类使用线程本地存储来管理在MFC环境中的线程的上下文信息。
一般地说,用户可以直接声明CWinThread对象,但在许多情况下,可以让MFC的全局函数AfxBeginThread来创建CWinThread对象。CWinThread类提供了几个函数来对线程进行操作。例如下面的几个函数。
    CWinThread:: AfxBeginThread函数:用来创建进程。
    CWinThread::CreateThread函数:用来启动新的线程。
    CWinThread::SuspendThread函数:用来挂起线程。
    CWinThread::ResumeThread函数:用来恢复线程的执行。
此外,读者还需知道,MFC中支持两种类型的线程:工作者线程和用户界面线程。下面将为读者详细介绍这两种线程的创建和使用。其区别在于:工作者线程常用于完成不要求用户输入的任务,如耗时计算、后台打印之类的任务。因此,其不需要有界面。工作者线程也适用于等待一个事件的发生。例如,从一个应用程序中接收数据,而不必要求用户等待。
17.2.2  创建工作者线程
工作者线程可以说是并行执行的一个函数,其一般用来完成那些不需要用户输入的后台任务。例如数据库备份功能和网络连接状态监视等功能。
比如,一个收费站的进口只有一个收费窗口在工作。该收费窗口正在处理正常的车辆收费工作,此时来了一个车队。该车队有许多车,需要花费很长时间来完成其收费工作。为了不使其他车辆阻塞,需要另外新开一个收费窗口,专门用于解决该车队的收费。如果把正常收费的窗口看做主线程,这个新开的窗口就是工作者线程,如图17-2所示。
 
图17-2  工作者线程
简单地说,创建一个工作者线程就是实现一个控制函数,并将其地址传给适当形式的AfxBeginThread函数的问题。一般来说,工作者线程形式的AfxBeginThread的声明格式如下:
CWinThread* AFXAPI AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority,
UINT nStackSize,
DWORD dwCreateFlags,
LPSECURITY_ATTRIBUTES lpSecurityAttrs
);
其中,主要参数说明如下所述。
    pfunThreadProc参数:指定线程的入口函数地址。
    pParam参数:指定传递给线程的参数。
简单地说,前两个参数是控制函数的地址和要传送给控制函数的参数。其余的参数可以指定线程的优先级、栈大小、创建后是立即挂起还是立即运行。最后的参数指定线程的安全属性,其默认值为NULL,即表示该线程将继承调用线程的安全属性。

提示:该函数调用成功的返回值是CWinThread类的指针。可以通过它实现对线程的控制。在线程函数返回时线程将被结束,在线程内部可以利用void AfxEndThread(UINT nExitCode);结束线程。其中,nExitCode为退出码。
工作者线程一旦启动,就开始执行控制函数。线程结束,控制函数也就结束了。线程控制函数的原型如下:
UINT MyControllingFunction(LPVOID pParam);
其中的函数名并不是固定的那个函数名,而是用户自定义的函数名,可以为任何合法的命名。如用户自定义名为MyThread。
例如,下面语句创建了一个工作者线程,其中指定线程的入口函数地址为function函数的地址。
UINT function(LPVOID pParam )
{
  while(true)
  {
    printf("Welcome to 21 Visual C++");
    Sleep(1000);
    printf("/t");
    return 0;
  }
}
AfxBeginThread(function, NULL);                        //用于创建工作者线程

目录
相关文章
|
4月前
|
Java 调度
|
4月前
|
存储 Java 调度
线程池的概述和创建
线程池的创建,构造器需要分别传入什么参数
线程池的概述和创建
|
6月前
|
Java 调度
|
缓存 Java 开发者
Java中多线程创建方式对比与线程池相关原理概述汇总(超详细)
Java中多线程创建方式对比与线程池相关原理概述汇总(超详细) 准备加入阿里开发者社区,同时也是很久没有写文章了,一时也不知道从何写起,那就先从多线程来吧,这次想把多线程与高并发的相关知识进行一下梳理,从多线程的几种创建方式开始,逐步到线程池原理分析,再到java中常用锁的使用场景与原理分析,再到高并发的处理方案,以及后面分布式锁等知识点,分成批次来进行梳理,这次先分析一下多线程的创建方式的异同点与线程池的执行原理。
1326 3
Java中多线程创建方式对比与线程池相关原理概述汇总(超详细)
|
存储 缓存 资源调度
多线程的概述
多线程的概述
|
监控 并行计算 Java
《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)(四)
《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)
《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)(四)
|
Java 调度
《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)(三)
《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)
《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)(三)
|
监控 Java Linux
《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)(二)
《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)
《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)(二)
|
存储 Java 应用服务中间件
《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)(一)
《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)
《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)(一)
《JUC并发编程 - 基础篇》JUC概述 | Lock接口 | 线程间通信 | 多线程锁 | 集合线程安全(三)
《JUC并发编程 - 基础篇》JUC概述 | Lock接口 | 线程间通信 | 多线程锁 | 集合线程安全
《JUC并发编程 - 基础篇》JUC概述 | Lock接口 | 线程间通信 | 多线程锁 | 集合线程安全(三)