工作线程和用户界面线程的创建
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当你在后台用线程来打印一些图形时.有时在打印一部分后,你希望可以停下来,那么此如 何让线程停止呢.
工作者线程的 AfxBeginThread
工作者线程的 AfxBeginThread 的原型如下: CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );//用于创建工作者线程 返回值: 成功时返回一个指向新线程的线程对象的指针,否者 NULL。 pfnThreadProc : 线程的入口函数,声明一定要如下: UINT MyThreadFunction(LPVOID pParam),不能设置为 NULL; pParam : 传递入线程的参数,注意它的类型为:LPVOID,所以我们可以传递一个结构体 入线程. nPriority : 线程的优先级,一般设置为 0 .让它和主线程具有共同的优先级. nStackSize : 指定新创建的线程的栈的大小.如果为 0, 新创建的线程具有和主线程一样的 大小的栈 dwCreateFlags : 指定创建线程以后,线程有怎么样的标志.可以指定两个值: CREATE_SUSPENDED : 线程创建以后,会处于挂起状态,直到调用:ResumeThread 0 : 创建线程后就开始运行. lpSecurityAttrs : 指向一个 SECURITY_ATTRIBUTES 的结构体,用它来标志新创建线程 的安全性.如果为 NULL, 那么新创建的线程就具有和主线程一样的安全性. 如果要在线程内结束线程,可以在线程内调用 AfxEndThread. 结束线程的两种方式
Windows 按线程是否拥有用户界面,把线程分为用户界面线程和工作线程。Байду номын сангаас
工作线程不能处理用户消息,通常是用来执行一些后台任务。 在程序中只要调用 AfxBeginThread 函数就可以创建并启动一个工作线程了。
用户界面线程和工作者线程都是由 AfxBeginThread 创建的。现在,考察该函数:MFC 提 供了两个重载版的 AfxBeginThread,一个用于用户界面线程,另一个用于工作者线程,分别有 如下的原型和过程:
用户界面线程的 AfxBeginThread
用户界面线程的 AfxBeginThread 的原型如下: CWinThread* AFXAPI AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority, UINT nStackSize, DWORD dwCreateFlags, LPSECURITY_ATTRIBUTES lpSecurityAttrs) 其中: 参数 1 是从 CWinThread 派生的 RUNTIME_CLASS 类; 参数 2 指定线程优先级,如果为 0,则与创建该线程的线程相同; 参数 3 指定线程的堆栈大小,如果为 0,则与创建该线程的线程相同; 参数 4 是一个创建标识,如果是 CREATE_SUSPENDED,则在悬挂状态创建线程,在线 程创建后线程挂起,否则线程在创建后开始线程的执行。 参数 5 表示线程的安全属性,NT 下有用。 MFC 把消息处理函数封装在 CCmdTarget 类中,而在这个 CCmdTarget 类的基础上,又 封装了一些创建线程的函数,从而派生出 CWndThread 类。因此,为了创建可以响应消息的用 户界面线程,在程序设计时,必须以 MFC 的 CWndThread 类为基类派生一个线程类,而且在 一般的时候需要重写类的 InitInstance()和 ExitInstance()函数, 在 InitInstance()中编写线程的初 始化代码,ExitInstance()中编写撤销线程对象的代码。