1.创建一个 CWinThread 的派生类CUiTread2
CWinThread * pTread = AfxBeginThread ( RUNTIME_CLASS ( CUiTread2 ));
CWinThread 类是 MFC 用来封装线程的,包括 UI 线程和工作者线程。因此每个 MFC 程序至少使用一个 CWinThread 派生类。被 MFC 程序员熟知的 CWinApp 应用类就从这里派生。
用户界面线程通常用于处理用户输入和响应用户事件,这些行为独立于执行该应用程序其他部分的线程。已经创建并启动主应用程序线程(在 CWinApp 导出的类中提供)。本文描述创建其他用户界面线程所需的步骤。
创建用户界面线程时,必须首先从 CWinThread 派生类。必须使用 DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE 宏声明并实现此类 。此类必须重写某些函数,也可以重写其他函数。下表列出了这些函数及其用途。
创建用户界面线程时要重写的函数
函数 | 用途 |
ExitInstance | 线程终止时执行清除。通常重写。 |
InitInstance | 执行线程实例初始化。必须重写。 |
OnIdle | 执行线程特定的闲置时间处理。通常不重写。 |
PreTranslateMessage | 将消息调度到 TranslateMessage 和 DispatchMessage 之前对其进行筛选。通常不重写。 |
ProcessWndProcException | 截获由线程的消息和命令处理程序引发的未处理异常。通常不重写。 |
Run |
|
class CSerialFun : public CWinThread
{
DECLARE_DYNCREATE(CSerialFun)
protected:
CSerialFun(); // 动态创建所使用的受保护的构造函数
~CSerialFun();//virtual ~CSerialFun();
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
LRESULT SCANTIMEOUT() ; // 检测 UB 当前是否处理指令超时,以此来判断是 UB 否未处理信息
int PACKFingerBH( char *p_roomAddress); // 检测数据库 检测指定 UB 上已有的指纹
public:
CLBFunction LogicFunction;
HWND HaimDlg;
CArray <char* ,char*> m_LbAdrArry; //LB 地址队列
CList<ipType> m_DictateArry; // 命令链表
CList<ipType> m_AckingArry; // 等待回码命令链表
int m_lbNow; // 控制访问 which LB 缓存空闲
CDataOperation *p_DataOperation ; // 数据处理层
CMap<int, int, int, int> lbBufsMap; // 哈希表,存储 LB 的空余缓存数
protected:
DECLARE_MESSAGE_MAP()
};
AfxBeginThread 为您完成大部分工作。它创建类的新对象、使用您提供的信息初始化该对象并调用 CWinThread::CreateThread 开始执行线程。在整个过程中进行检查,确保假如创建过程的任何部分出现故障,所有对象都能被正确地解除分配。