MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。
工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。
用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等。
一、建立工程。
1、建立一个基于对话框的工程VideoProcess,在对话框中加入一个按钮IDC_CAMERA,标题为“打开摄像头” 。
右击工程并选中“New Class…”为工程添加基类为CWinThread派生线程类CCamera。
给工程添加新对话框IDD_CAMERA_DLG,标题为“摄像头视频”。 为对话框IDD_CAMERA_DLG创建一个基于CDialog的类CCameraDlg。
2、在主对话框中添加按钮,并双击后,添加消息响应函数(启动用户界面线程),还要加上CCamera类的头文件。
void CVideoProcessDlg::OnBnClickedCameraDlg() { // TODO: 在此添加控件通知处理程序代码 CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CCamera)); }
3、并在CCamera类中添加protected变量CCameraDlg m_dlg,并添加头文件。
#include "CameraDlg.h" // CCamera class CCamera : public CWinThread { DECLARE_DYNCREATE(CCamera) protected: CCamera(); // 动态创建所使用的受保护的构造函数 virtual ~CCamera(); CCameraDlg m_dlg; //tfygg public: virtual BOOL InitInstance(); virtual int ExitInstance(); protected: DECLARE_MESSAGE_MAP() };
分别重载InitInstance()函数和ExitInstance()函数:
BOOL CCamera::InitInstance() { // TODO: 在此执行任意逐线程初始化 m_dlg.Create(IDD_CAMERA_DLG); m_dlg.ShowWindow(SW_SHOW); m_pMainWnd=&m_dlg; return TRUE; } int CCamera::ExitInstance