有三种方式:变量(即成员变量),消息(PostMessage()和SendMessage()的参数传递),事件(也适用于进程间通信)
建立线程有三种方式:CreateThread() ,WindowsAPI 此方法的退出方式为ExitThread
AfxBeginThread() ,MFC
_beginthreadex() ,C++类中封装的函数 :由申请空间和CreateThread()两部分组成 , 释放则由ExitThread()和释放空间两部分组成
用一个小程序来练习
功能如下:Create为创建线程,Calc为计算结果,结果显示在下方的编辑框中
1.初始化函数:
CMy0202ThreadTalkingDlg::CMy0202ThreadTalkingDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CMy0202ThreadTalkingDlg::IDD, pParent) , m_radio(1) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_hThread = NULL; m_bFlagQuit = true; m_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件(安全值,自动,初始化为无信号,事件名称) }
2. Create按钮处理函数:C++中创建线程的函数一般用:m_hThread =(HANDLE)_beginthreadex(NULL,0,&ThreadProc,this,0,0);//参数与CreateThread相同
3.线程的处理函数:
unsigned _stdcall ThreadProc( void * lpvoid) { CMy0202ThreadTalkingDlg *pthis = (CMy0202ThreadTalkingDlg*)lpvoid; while(pthis->m_bFlagQuit)//线程退出时使用 { //等事件 if(WAIT_TIMEOUT== WaitForSingleObject(pthis->m_hEvent,100)) continue;//等不到信号则再继续等,即没有按Calc按钮(事件置为有信号,创建时没有信号) int nsum =0; nsum = (1+pthis->m_nNum)*pthis->m_nNum/2; //将值显示到主线程中 pthis->PostMessage(UM_MSG,nsum); // SendMessage } return 0; }
4.Calcu按钮的处理函数:
void CThreadPhoneDlg::OnBnClickedButton2() { m_bflag = true; UpdateData(TRUE);//TRUE:控件给变量,FALSE:变量给控件 switch(m_radio) { case 0: num = 10; break; case 1: num = 100; break; case 2: num = 1000; break; default: break; } SetEvent(m_hEvent);//将事件置为有信号 }
5.对单选按钮,
在资源视图中:格式->Tab键顺序,将按钮设置成顺序,将第一个Radio Button属性Grouop设为true,右键添加变量,类别为Value
即声明变量,绑定ID和变量,UpdateDate()为两者之间相互赋值的函数,按第一个Radio Button则m_radio为0,第二个则为1,依此类推
6.添加命令消息,1>定义信号 #define UM_MSG (WM_USER + 1)
2>绑定 ON_MESSAGE(UM_MSG,&CMy0202ThreadTalkingDlg::OnMsg)
3>声明并实现函数
LRESULT CThreadPhoneDlg::OnMsg(WPARAM w, LPARAM l) { CString str; str.Format(_T("%d") , w); m_edit.SetWindowText(str); return 0; }