MFC总结(13) -- 在mfc中使用线程 更新Progress Control(2)

来源:互联网 发布:电脑看书软件阅读器 编辑:程序博客网 时间:2024/05/02 00:03

我们在 <MFG总结(12) -- 在mfc中使用线程 更新Progress Control(1)> 中已经实现了线程的使用,但是在我后面的项目中,发现这样 在 第8步骤中的 Cmfc线程Dlg* hh = (Cmfc线程Dlg*)AfxGetApp()->m_pMainWnd;  出现了问题。所以有了下面的一种操作。

   我们只需要将原来的代码上进行更改即可。

   1、将线程方法放置到类中,不过需要使用static进行修饰。我们在线程方法中需要调用类的成员函数updatePro,所以我们需要定义一个类的静态指针。

   

上完整代码

// mfc线程Dlg.h : 头文件//#pragma once#include "afxcmn.h"// Cmfc线程Dlg 对话框class Cmfc线程Dlg : public CDialogEx{// 构造public:Cmfc线程Dlg(CWnd* pParent = NULL);// 标准构造函数// 对话框数据enum { IDD = IDD_MFC_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 支持// 实现protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:CProgressCtrl m_threadProgressCtrl;afx_msg void OnBnClickedButton1();afx_msg void OnTimer(UINT_PTR nIDEvent);<span style="white-space:pre"></span><pre name="code" class="html" style="line-height: 18px;"><span style="white-space:pre"></span>//线程指针
CWinThread *m_pThread;
<span style="font-family: Consolas, 'Courier New', Courier, mono, serif;"></span><span style="font-family: Consolas, 'Courier New', Courier, mono, serif;">//更新界面</span>
void updatePro(DWORDLONG size);//成员线程函数声明static UINT ThreadFunc(LPVOID pParam);//类静态指针static Cmfc线程Dlg * m_this;};

2、在cpp文件中对 m_this进行声明,并在构造器中将this指针赋值给m_this指针

上完整代码

// mfc线程Dlg.cpp : 实现文件//#include "stdafx.h"#include "mfc线程.h"#include "mfc线程Dlg.h"#include "afxdialogex.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx{public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()// Cmfc线程Dlg 对话框Cmfc线程Dlg * Cmfc线程Dlg::m_this = nullptr;Cmfc线程Dlg::Cmfc线程Dlg(CWnd* pParent /*=NULL*/): CDialogEx(Cmfc线程Dlg::IDD, pParent){m_this = this;m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void Cmfc线程Dlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_THRED_PROGRESS, m_threadProgressCtrl);}BEGIN_MESSAGE_MAP(Cmfc线程Dlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_TIMER()END_MESSAGE_MAP()// Cmfc线程Dlg 消息处理程序BOOL Cmfc线程Dlg::OnInitDialog(){CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);// 设置大图标SetIcon(m_hIcon, FALSE);// 设置小图标// TODO:  在此添加额外的初始化代码//添加定时器SetTimer(1, 200, NULL);//设置Progress Control//范围m_threadProgressCtrl.SetRange(0, 200);//开始位置m_threadProgressCtrl.SetPos(0);return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE}void Cmfc线程Dlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}}// 如果向对话框添加最小化按钮,则需要下面的代码//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,//  这将由框架自动完成。void Cmfc线程Dlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int 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;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。HCURSOR Cmfc线程Dlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}void Cmfc线程Dlg::updatePro(DWORDLONG size){//线程函数实现CString str;m_threadProgressCtrl.SetPos(size);str.Format(L"%d", size);//给Static Text设置文本内容GetDlgItem(IDC_SHOETEXTSTATIC)->SetWindowText(str);Sleep(500);}UINT  Cmfc线程Dlg::ThreadFunc(LPVOID pParam){DWORDLONG size = (DWORDLONG)pParam;//Cmfc线程Dlg* hh = (Cmfc线程Dlg*)AfxGetApp()->m_pMainWnd;m_this->updatePro(size);return 0;}void Cmfc线程Dlg::OnTimer(UINT_PTR nIDEvent){// TODO:  在此添加消息处理程序代码和/或调用默认值//一个随机数字DWORDLONG tim = rand() % 200;//启动线程m_pThread = AfxBeginThread(ThreadFunc, (LPVOID)tim); //销毁线程m_pThread->ResumeThread();CDialogEx::OnTimer(nIDEvent);} 





0 0
原创粉丝点击