MFC 在线程中通过PostMessage更新界面主线程

来源:互联网 发布:mysql 多个字段排序 编辑:程序博客网 时间:2024/05/22 16:40

转载自 http://www.cnblogs.com/greatverve/archive/2012/12/21/mfc-thread-CProgressCtrl.html

几个要点:
1.对话框中启动新线程。把句柄做参数传递。
2.线程类中定义静态函数,也可以在对话框类中定义个全局函数。
3.线程回调函数必须是静态,且以void*为参数。
4.定义自定义消息,线程类发送,对话框类响应。




CThread类

// Thread.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(void);    ~CThread(void);};// Thread.cpp#include "StdAfx.h"#include "Thread.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(100);    }    AfxMessageBox("完成");    ::PostMessage(hWnd,WM_USER_MSG,WPARAM(0),LPARAM(0));    _endthread();}CThread::CThread(void){}CThread::~CThread(void){}


对话框类

// 消息映射ON_MESSAGE(WM_USER_MSG, &CThreadProgDlg::OnMsg)// OnInitDialogCProgressCtrl *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;}

附件源码:http://download.csdn.net/detail/liubaoxyz/9634059

密码:blog.csdn.net/liubaoxyz

0 1