已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
今天给出一个MFC的多线程编程示例吧,难度等级,中!示例如下:(1)先用appwizards生成一个MFC的Dialog应用模板,假定对话框类为CTest01Dlg。(2)再添入两个oicq的bmp文件到资源中去(3)添加一个按钮(button)到对话框上.用作启动、停止动画的button(4)用ClassWizard为button/onclick及dlg/ontimer生成事件响应函数,(5)用Resource Symbol加入一个标识定义IDC_TIMER1(6)在ClassView中为CTest01Dlg加入以下成员变量和成员函数CriticalSection ccs;CBitmap bm2;CWinThread* pMyThread;static UINT MyThreadProc( LPVOID pParam);void DisplayFace(CPoint r);实现文件中加入相应代码(见下面)(7)stdafx.h中加入i nclude 源代码如下,凡是我新加的代码周围都有注释包围,其它是ClassWizards自动写的: / stdafx.h : include file for standard system include files,/ or project specific include files that are used frequently, but/ are changed infrequentlyfile:/ #if !defined(AFX_STDAFX_H_5B92DAA8_FE27_4702_8037_A2538343E69D_INCLUDED_)#define AFX_STDAFX_H_5B92DAA8_FE27_4702_8037_A2538343E69D_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#define VC_EXTRALEAN / Exclude rarely-used stuff from Windows headersi nclude / MFC core and standard componentsi nclude / MFC extensionsi nclude / MFC support for Internet Explorer 4 Common Controlsfile:/加入头引用主要是CCriticalSection对象的定义.i nclude file:/加入结束#ifndef _AFX_NO_AFXCMN_SUPPORTi nclude / MFC support for Windows Common Controls#endif / _AFX_NO_AFXCMN_SUPPORTfile:/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_STDAFX_H_5B92DAA8_FE27_4702_8037_A2538343E69D_INCLUDED_)/ test01Dlg.h : header filefile:/#if !defined(AFX_TEST01DLG_H_F3780E23_CCFC_468C_A262_50FFF1D991BC_INCLUDED_)#define AFX_TEST01DLG_H_F3780E23_CCFC_468C_A262_50FFF1D991BC_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000/ CTest01Dlg dialogclass CTest01Dlg : public CDialog/ Constructionpublic:file:/加入CBitmap bm2;CCriticalSection ccs;CWinThread* pMyThread;static UINT MyThreadProc( LPVOID pParam);void DisplayFace(CPoint r);CTest01Dlg(CWnd* pParent = NULL); / standard constructorfile:/加入结束/ Dialog Datafile:/AFX_DATA(CTest01Dlg)enum IDD = IDD_TEST01_DIALOG ;/ NOTE: the ClassWizard will add data members herefile:/AFX_DATA/ ClassWizard generated virtual function overridesfile:/AFX_VIRTUAL(CTest01Dlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV supportfile:/AFX_VIRTUAL/ Implementationprotected:HICON m_hIcon;/ Generated message map functionsfile:/AFX_MSG(CTest01Dlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnButton1();afx_msg void OnTimer(UINT nIDEvent);file:/AFX_MSGDECLARE_MESSAGE_MAP();file:/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_TEST01DLG_H_F3780E23_CCFC_468C_A262_50FFF1D991BC_INCLUDED_)/ test01Dlg.cpp : implementation filefile:/i nclude stdafx.hi nclude test01.hi nclude test01Dlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Datafile:/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;file:/AFX_DATA/ ClassWizard generated virtual function overridesfile:/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV supportfile:/AFX_VIRTUAL/ Implementationprotected:file:/AFX_MSG(CAboutDlg)file:/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)file:/AFX_DATA_INIT(CAboutDlg)file:/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);file:/AFX_DATA_MAP(CAboutDlg)file:/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)file:/AFX_MSG_MAP(CAboutDlg)/ No message handlersfile:/AFX_MSG_MAPEND_MESSAGE_MAP()/ CTest01Dlg dialogCTest01Dlg:CTest01Dlg(CWnd* pParent /*=NULL*/): CDialog(CTest01Dlg:IDD, pParent)file:/AFX_DATA_INIT(CTest01Dlg)/ NOTE: the ClassWizard will add member initialization herefile:/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);file:/加入pMyThread =NULL;file:/加入结束void CTest01Dlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);file:/AFX_DATA_MAP(CTest01Dlg)/ NOTE: the ClassWizard will add DDX and DDV calls herefile:/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CTest01Dlg, CDialog)file:/AFX_MSG_MAP(CTest01Dlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_WM_TIMER()file:/AFX_MSG_MAPEND_MESSAGE_MAP()/ CTest01Dlg message handlersBOOL CTest01Dlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE); / Set big iconSetIcon(m_hIcon, FALSE); / Set small icon/ TODO: Add extra initialization herefile:/加入bm0.LoadBitmap (IDB_BITMAP1);bm1.LoadBitmap (IDB_BITMAP3);file:/加入结束return TRUE; / return TRUE unless you set the focus to a controlvoid CTest01Dlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CTest01Dlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();HCURSOR CTest01Dlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;file:/加入void CTest01Dlg:OnButton1() static BOOL bStarted=FALSE;if (!bStarted)SetTimer(IDC_TIMER1,500,NULL); pMyThread=AfxBeginThread(MyThreadProc,this);elseif (pMyThread)pMyThread-PostThreadMessage (WM_QUIT,0,0);:WaitForSingleObject(pMyThread-m_hThread ,INFINITE);pMyThread=NULL;KillTimer(IDC_TIMER1);bStarted=!bStarted;(CButton*)GetDlgItem(IDC_BUTTON1)-SetWindowText(bStarted?_T(停止):_T(启动);void CTest01Dlg:OnTimer(UINT nIDEvent) if (nIDEvent=IDC_TIMER1)DisplayFace(CPoint(10,10);CDialog:OnTimer(nIDEvent);void CTest01Dlg:DisplayFace(CPoint p)static int i=0;ccs.Lock ();BITMAP bmo;bmi.GetObject (sizeof(bmo),&bmo);CClientDC dc(this);CDC bmpDC;bmpDC.CreateCompatibleDC (&dc);bmpDC.SelectObject (&bmi);dc.BitBlt (p.x ,p.y ,bmo.bmWidth,bmo.bmHeight,&bmpDC,0,0,SRCCOPY);i+;if (i=sizeof(bm)/sizeof(bm0) i=0;ccs.Unlock ();UINT CTest01Dlg:MyThreadProc(LPVOID pParam)CTest01Dlg *me=(CTest01Dlg *)pParam;MSG msg;while(!PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)me-DisplayFace (CPoint(100,10);:Sleep (200);return 0;file:/加入结束MFC创建多线程实例 收藏 平时在MFC里使用多线程时其实是很方面的,因为微软提供了一个API让我们很方面的去创建线程:下面是MSDN中关于CreateThread的函数原型:1、函数原型声明: view plaincopy to clipboardprint?CreateThread The CreateThread function creates a thread to execute within the virtual address space of the calling process. To create a thread that runs in the virtual address space of another process, use the CreateRemoteThread function. HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); CreateThreadThe CreateThread function creates a thread to execute within the virtual address space of the calling process.To create a thread that runs in the virtual address space of another process, use the CreateRemoteThread function.HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId); 2、参数说明:view plaincopy to clipboardprint?lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。 dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。 lpStartAddress,指向线程函数的指针,形式:函数名,函数名称没有限制,但是必须以下列形式声明: DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。 lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为Nil。 dwCreationFlags :线程标志,可取值如下 CREATE_SUSPENDED: 创建一个挂起的线程 0 :创建后立即激活。 lpThreadId:保存新线程的id。 lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。lpStartAddress,指向线程函数的指针,形式:函数名,函数名称没有限制,但是必须以下列形式声明:DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。 lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为Nil。 dwCreationFlags :线程标志,可取值如下 CREATE_SUSPENDED: 创建一个挂起的线程 0 :创建后立即激活。 lpThreadId:保存新线程的id。 3、返回值:函数成功,返回线程句柄;函数失败返回false。4、实例代码:A、新建一个对话框工程为MFC,在MFCDlg.h添加两个成员函数,注意一定要是静态的,代码如下:view plaincopy to clipboardprint?/ / CMFCDlg dialog class CMFCDlg : public CDialog / Construction public: CMFCDlg(CWnd* pParent = NULL); / standard constructor / 线程B1、B2函数 static DWORD WINAPI ThreadB1(LPVOID lpParam); static DWORD WINAPI ThreadB2(LPVOID lpParam); . / CMFCDlg dialogclass CMFCDlg : public CDialog/ Constructionpublic:CMFCDlg(CWnd* pParent = NULL);/ standard constructor/ 线程B1、B2函数static DWORD WINAPI ThreadB1(LPVOID lpParam);static DWORD WINAPI ThreadB2(LPVOID lpParam);. B、在cpp文件中实现函数,添加代码如下:view plaincopy to clipboardprint?DWORD WINAPI CMFCDlg:ThreadB1(LPVOID lpParam) / 定义结构对象 PROCESS_INFORMATION pi; STARTUPINFO si; BOOL bRet; / 申请空间 ZeroMemory(&pi,sizeof(PROCESS_INFORMATION); ZeroMemory(&si,sizeof(STARTUPINFO); / 设置进程启动属性 si.cb = sizeof(STARTUPINFO); si.lpReserved = NULL; si.lpDesktop = NULL; si.lpTitle = NULL; si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; si.cbReserved2 = NULL; si.lpReserved2 = NULL; bRet = CreateProcess(_T(C:Program FilesInternet ExplorerIEXPLORE.exe), _T(), NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); return 0; DWORD WINAPI CMFCDlg:ThreadB2(LPVOID lpParam) / 定义结构对象 PROCESS_INFORMATION pi; STARTUPINFO si; BOOL bRet; / 申请空间 ZeroMemory(&pi,sizeof(PROCESS_INFORMATION); ZeroMemory(&si,sizeof(STARTUPINFO); / 设置进程启动属性 si.cb = sizeof(STARTUPINFO); si.lpReserved = NULL; si.lpDesktop = NULL; si.lpTitle = NULL; si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; si.cbReserved2 = NULL; si.lpReserved2 = NULL; bRet = CreateProcess(_T(C:Program FilesInternet ExplorerIEXPLORE.exe), _T(/wangningyu), NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); return 0; DWORD WINAPI CMFCDlg:ThreadB1(LPVOID lpParam) / 定义结构对象PROCESS_INFORMATION pi;STARTUPINFOsi;BOOLbRet;/ 申请空间ZeroMemory(&pi,sizeof(PROCESS_INFORMATION);ZeroMemory(&si,sizeof(STARTUPINFO);/ 设置进程启动属性si.cb=sizeof(STARTUPINFO);si.lpReserved=NULL;si.lpDesktop=NULL;si.lpTitle=NULL;si.dwFlags=STARTF_USESHOWWINDOW;si.wShowWindow=SW_SHOWNORMAL;si.cbReserved2=NULL;si.lpReserved2=NULL;bRet = CreateProcess(_T(C:Program FilesInternet ExplorerIEXPLORE.exe), _T(), NULL,NULL,FALSE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026秋招:阿特斯阳光电力集团试题及答案
- 2026青海盐湖工业股份公司秋招面试题及答案
- 2026青海交通控股集团秋招试题及答案
- 2026南方航空秋招笔试题及答案
- 2026联影医疗招聘面试题及答案
- 2025广东清远市英德市兴德投资有限公司招聘员工13人笔试参考题库附带答案详解(3卷合一)
- 2025山西中煤一局集团有限公司应届高校毕业生招聘20人笔试参考题库附带答案详解
- 2025山东烩道食品有限公司招聘4人笔试参考题库附带答案详解(3卷合一)
- 2025山东东营区邮政弹性备员(大堂)招聘11人笔试历年备考题库附带答案详解
- 2025安徽皖江大龙湾控股集团有限公司招聘13人笔试参考题库附带答案详解(3卷合一)
- 3D技术介绍及应用
- 甘肃医学院《药物化学》2024-2025学年期末试卷(A卷)
- 安全通道防护棚施工方案
- (正式版)DB54∕T 0430-2025 《河湖健康评价规范》
- 2025年设备预测性维护技术创新在电力设备中的应用
- 2025年江苏省职业院校技能大赛中职组(安全保卫)考试题库(含答案)
- 2025-2030集中式与分散式青年公寓运营效率对比分析
- 矿山环境监测评价报告
- 广西协美化学品有限公司年产7400吨高纯有机过氧化物项目环评报告
- 铅球的技术教学
- 2025年嫩江市招聘农垦社区工作者(88人)笔试备考试题附答案详解
评论
0/150
提交评论