要点
1.对话框中启动新线程。把句柄做参数传递。
2.线程类中定义静态函数,也可以在对话框类中定义个全局函数。
3.线程回调函数必须是静态,且以void*为参数。
4.定义自定义消息,线程类发送,对话框类响应。
效果
代码
多线程控制类
CThread.h
#pragma once#include <process.h>#include <Windows.h>#define WM_USER_MSG WM_USER + 1001class CThread{public:// 线程回调函数必须是全局函数static void Run(void *ptr);public:CThread();~CThread();};
CThread.cpp
#include "stdafx.h"#include "CThread.h"void CThread::Run(void * ptr){HWND hWnd = (HWND)ptr;for (int i = 0; i < 100; ++i){// 发送消息到主对话框::PostMessage(hWnd, WM_USER_MSG, WPARAM(i), LPARAM(0));Sleep(10);}MessageBox(NULL, _T("完成!"),_T("完成!"),NULL);// 回归为原始值0::PostMessage(hWnd, WM_USER_MSG, WPARAM(0), LPARAM(0));_endthread();}CThread::CThread(){}CThread::~CThread(){}
消息类
// 消息映射,在类向导自定义个WM_USER_MSG消息,然后绑定OnMsg函数ON_MESSAGE(WM_USER_MSG, &CThreadProgDlg::OnMsg)// OnInitDialog 在MFC初始化函数OnInitDialog 加CProgressCtrl *prog = (CProgressCtrl *)GetDlgItem(IDC_PROGRESS1);prog->SetRange(0,100);
主对话框
// 绑定开始按钮的函数void CThreadProgDlg::OnBnClickedOk(){// TODO: 在此添加控件通知处理程序代码_beginthread(&CThread::Run,0,this->GetSafeHwnd());//CDialogEx::OnOK();}// 自定义消息处理函数LRESULT CThreadProgDlg::OnMsg( WPARAM wp,LPARAM lp ){CProgressCtrl *prog = (CProgressCtrl *)GetDlgItem(IDC_PROGRESS1);prog->SetPos((int)wp);return 1L;}