当程序在处理较长的数据时,利用多线程创建一个对话框,提示"正在处理数据请稍后"
先创建一个基于对话框程序,工程名se,利用Class Wizard 添加一个CWinThread的派生类thread,CWinThread对象代表在一个应用程序内运行的线程。再插入一个对话框资源,与CDialog派生类d1类相关连,在d1对话框中添加文本控件将标题设为"正在处理数据请稍后"在主对话框CSeDlg中添加一个按钮控件,双击钮控件添加消息响应函数OnButton1() 在消息响应函数中调用AfxBeginThread()创建一个新的线程
在thread线程类重载函数virtual BOOL InitInstance( )中创建一个对话框,提示"正在处理数据请稍后"
#include "thread.h"将CWinThread的派生类thread的头文件包含 // Added by ClassView
class CSeDlg : public CDialog
{
// Construction
public:
thread *m_thread;//定义一个thread类指针变量md1,定义变量类型一定要指针类型否则编译出错

void CSeDlg::OnButton1() 
{m_thread=(thread *)AfxBeginThread(RUNTIME_CLASS(thread));//调用这个函数以创建一个新的线程用户界面线程

class d1 : public CDialog//插入一个对话框资源,与CDialog派生类d1类相关连
{
// Construction
public:

d1(CWnd* pParent = NULL);   // standard constructor// Dialog Data
//{{AFX_DATA(d1)
enum { IDD = IDD_DIALOG1 };
CProgressCtrl m_pro;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(d1)
protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
//}}AFX_VIRTUAL// Implementation
protected: // Generated message map functions
//{{AFX_MSG(d1)
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
afx_msg void OnTimer(UINT nIDEvent);
virtual BOOL OnInitDialog();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};#include"d1.h"//将CDialog派生类d1类的头文件包含
class thread : public CWinThread//利用Class Wizard 添加一个CWinThread的派生类thread
{
DECLARE_DYNCREATE(thread)
protected:
thread();           // protected constructor used by dynamic creation// Attributes
public:// Operations
public:
d1 md1;//定义一个d1类成员变量md1
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(thread)
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
//}}AFX_VIRTUAL// Implementation
protected:
virtual ~thread(); // Generated message map functions
//{{AFX_MSG(thread)
// NOTE - the ClassWizard will add and remove member functions here.
afx_msg void Ont();
//}}AFX_MSG DECLARE_MESSAGE_MAP()
};......}
BOOL thread::InitInstance()
{
// TODO:  perform and per-thread initialization here
md1.Create(IDD_DIALOG1);//创建d1一个对话框
md1.ShowWindow(TRUE);//显示对话框
return TRUE;
}

解决方案 »

  1.   

    线程中发送消息PostMessage给主线程,然后主线程来DoModal创建对话框
      

  2.   

    最好是界面和数据处理分离,你在线程中去处理数据,当数据处理超过一定时间,然后PostMessage()给界面窗口,弹出MessageBox。
      

  3.   

    工作线程来处理数据,行!比如我要从主对话框多个控件中读取数据,然后把它写入EXCEL.XLS文件中,要将主对话框控件中读取数据传到工作线程中,要定义多个全局变量,或者结构体,比较复杂,因为工作线程是在类外部定义,只能用API函数,如果在主对话框主线程中直接读取控件中数据并把它写入EXCEL.XLS文件中,简单的多,懂吗??????