MFC多线程建立

  先说说线程的的概念,因为windows不同于单片机可以同时自行很多操作,这些同时进行的操作就是一个个线程,我们在编写程序时有时也需要操作多个线程,于是就要程序实现多线程。

  我们把一个进程想象中桌子,线程就是上面的菜品,windows新建菜很容易,推建大家都是一张桌子上吃饭,Linux新建桌子就比较容易,所以推荐大家新建桌子。因为服务器都是很多进程的所以服务器一般都是用linux写的。

  windows建立线程比较容易所以,windows建议大家新建线程。话不多说,我们开始建立线程。

线程有两个用户界面线程和工作者线程

 一、工作者线程

这个很简单

在你想执行另外一个线程时创建一个线程

在你定义的类cxxxxdlg.h中定义:CWinThread* pThread;//多线程指针

在你想启动多线程时

pThread=AfxBeginThread(XXXXXXXX,想传递的参数,若无NULL);

在这个线程函数 xxxxx中执行你想执行的操作就可以了

void Ccmare_1Dlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);
	info.ms=ms;
	info.ms_p=&ms_p;
	pThread=AfxBeginThread(ThreadFunc1,&info);


}

UINT ThreadFunc1(LPVOID lpParam)
{

	char strtemp[200];
	while(take_flage!=0);
	take_picture(strtemp);
	return 0;
}

  我这个函数的作用就是在点下按钮BUTTUN4后执行调取一张图片,而且不会影响我另一个程序的摄像头持续录像的功能。

还有一个就是用户界面线程

这个是用来进行多对话框弹出时才会使用,在同一个对话框就不需要使用用户界面线程


 

例程6 MultiThread6

建立一个基于对话框的工程MultiThread6,在对话框IDD_MULTITHREAD6_DIALOG中加入一个按钮IDC_UI_THREAD,标题为“用户界面线程” 右击工程并选中“New Class…”为工程添加基类为CWinThread派生线程类CUIThread。 给工程添加新对话框IDD_UITHREADDLG,标题为“线程对话框”。 为对话框IDD_UITHREADDLG创建一个基于CDialog的类CUIThreadDlg。使用ClassWizard为CUIThreadDlg类添加WM_LBUTTONDOWN消息的处理函数OnLButtonDown,如下:

1. void CUIThreadDlg::OnLButtonDown(UINT nFlags, CPoint point)
2. {
3. AfxMessageBox("You Clicked The Left Button!");
4. CDialog::OnLButtonDown(nFlags, point);
5. }

在UIThread.h中添加

1. #include "UIThreadDlg.h"

并在CUIThread类中添加protected变量CUIThread m_dlg:

01. class CUIThread : public CWinThread
02. {
03. DECLARE_DYNCREATE(CUIThread)
04. protected:
05. CUIThread();           // protected constructor used by dynamic creation
06.  
07. // Attributes
08. public:
09.  
10. // Operations
11. public:
12.  
13. // Overrides
14. // ClassWizard generated virtual function overrides
15. //{{AFX_VIRTUAL(CUIThread)
16. public:
17. virtual BOOL InitInstance();
18. virtual int ExitInstance();
19. //}}AFX_VIRTUAL
20.  
21. // Implementation
22. protected:
23. CUIThreadDlg m_dlg;
24. virtual ~CUIThread();
25.  
26. // Generated message map functions
27. //{{AFX_MSG(CUIThread)
28. // NOTE - the ClassWizard will add and remove member functions here.
29. //}}AFX_MSG
30.  
31. DECLARE_MESSAGE_MAP()
32. };

分别重载InitInstance()函数和ExitInstance()函数:

01. BOOL CUIThread::InitInstance()
02. {
03. m_dlg.Create(IDD_UITHREADDLG);
04. m_dlg.ShowWindow(SW_SHOW);
05. m_pMainWnd=&m_dlg;
06. return TRUE;
07. }
08.  
09. int CUIThread::ExitInstance()
10. {
11. m_dlg.DestroyWindow();
12. return CWinThread::ExitInstance();
13. }

双击按钮IDC_UI_THREAD,添加消息响应函数:

1. void CMultiThread6Dlg::OnUiThread()
2. {
3. CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CUIThread));
4. }

并在MultiThread6Dlg.cpp的开头添加:

1. #include "UIThread.h"

好了,编译并运行程序吧。每单击一次“用户界面线程”按钮,都会弹出一个线程对话框,在任何一个线程对话框内按下鼠标左键,都会弹出一个消息框。

原地址点击打开链接


  

猜你喜欢

转载自blog.csdn.net/qq_36305492/article/details/78346637
今日推荐