关于MFC中的界面线程和工作线程的处理

时间:2024-02-24 11:02:16

举个最简单的情况来说,用户界面线程通常用于处理用户输入和响应通过用户产生的消息和事件,例如women登录时的用户名和密码等信息。 工作线程通常用于完成任务,如不需要用户输入的的计算,WIN32不区分这两种线程,它只需要知道线程的启始地址,然后去启动执行线程。

CWinApp是一个用户界面线程对象,派生自CWinThread,处理通过用户产生的消息和事件,创建用户界面线程须要从CWinThread派生,然后申明和实现这个类,以及DECLARE_DYNCREATE 和IMPLEMENT_DYNCREATE宏。这个类必须重载一些函数,当然也可以重载其它的一些函数,如: ■ExitInstance ■InitInstance ■OnIdle ■PreTranslateMessage ■ProcessWndProcException

启动线程AfxBeginThread(),共四个参数。前面两个参数是必须的,参数1“:控制函数的地址,;参数2:传递给控制函数的参数,返回值是指向线程对象的指针。

实现控制函数: UINT MyControllingFunction( LPVOID pParam );函数终止应该返回一个UINT值,表示终止原因,通过退出代码为0表示成功退出,其它类型的值表示errors 。

例如一个完整的例子如下: 头文件*.h: UINT WorkThreadProc(LPVOID pParam);

源文件*.cpp: UINT WorkThreadProc(LPVOID pParam) { CReadFrontDlg *pDlg = (CReadFrontDlg *)pParam; pDlg->ConvertBmpToEos(); return 0; }

启动线程: AfxBeginThread(WorkThreadProc, this);

从非MFC线程访问MFC Object,假如有一个多线程应用程序,不是使用一个CWinThread对象创建的线程,你就不能从线程访问MFC 对象,换句话说不能从第二方(secondary)线程,访问任何MFC object,,要想访问MFC objects可以使用以下介绍的方法 Multithreading: Creating User-Interface Threads or Multithreading: Creating Worker Threads articles

另外,创建工作线程不需要从CWinThread派生的。

对比用户工作线程和用户界面线程,工作线程不须要处理消息,对于用户来说不须要与用户交互,不需要响应消息。

线程暂停和继续执行,系统维护一个计数器,暂停和继续执行相对应才有效,如当计数为0时线程才继续执行。 DWORD SuspendThread( HANDLE hThread ); DWORD ResumeThread( HANDLE hThread );

线程的信号事件设置: 问题,有时在一个应用程序当中使用了工作线程,并修改了局部变量或全局变量,程序最终得到的还是线程修改前的值,这时可以使用事件和设置信号来确定线程是否完成。 (1) 添加事件句柄 添加数据成员,事件对象的句柄 HANDLE m_hEventRecalcDone (2) 可在类的构造函数中实现 // 创建一个事件, 初始化为手动设置和有信号 m_hEventRecalcDone = CreateEvent(NULL, TRUE, TRUE, NULL); // manual reset, initially set (3) 创建线程时设置 // 指定事件对象的状态译置为无信号 ResetEvent(m_hEventRecalcDone); (4) 在线程中,设置指定事件的对象状态为有信号 SetEvent(pDlg->m_hEventRecalcDone); (5) 无限制的等待有信号的状态 pWorkThread = AfxBeginThread(WorkThreadProc, this); WaitForSingleObject(m_hEventRecalcDone, INFINITE);

两种线程的应用技巧有一下三点: 1.把UI线程都集中在主线程中。 2.把纯运算放到工作线程。 3.线程函数须为全局函数或一个类静态成员函数。转载请注明来源足球平台 http://www.pgjigou.com

相关文章