线程通信

一般可以有两种方式来实现线程间通信:1、使用全局变量2、使用自定义消息

1、利用全局变量来实现线程通信

通过一个例子来理解

例子:设计一个以对话框为主界面的应用程序,当按下一个按钮时,启动一个从线程,该线程显示一个表示正在运行的对话框(在对话框的标题上显示一个随时间增加的数字),而当按下另一个按钮时从线程结束运行。

实现:(1)用MFC创建一个基于对话框的应用程序,将ok按钮的标题修改为结束程序,将取消按钮的标题改为线程结束,在增加一个按钮,标题为线程开始。

(2)在对话框的实现文件中定义一个全局变量

BOOL bThreadExit=FALSE;

(3)在对话框的实现文件中定义一个线程函数

//定义一个线程函数
UINT MessageThread(LPVOID pParam)
{
 int i=0;
 CString str;
 while(bThreadExit!=TRUE)
 {
  str.Format(_T("Wait Exit times=%d"),i++);//注意这里需要加_T
  ::SetWindowText((HWND)pParam,str);
 }
 return 0;
}

(4)在添加按钮的消息函数中添加如下代码

void CThreadCommunicationDlg::OnBnClickedButton1()
{
 // TODO: 在此添加控件通知处理程序代码
 HWND hwnd=GetSafeHwnd();//获取对话框窗口句柄
 AfxBeginThread(MessageThread,//线程函数
  hwnd,//将对话框窗口句柄作为参数传进线程函数当中
  THREAD_PRIORITY_NORMAL
  );

}

(5)重写Cancel按钮的消息响应函数


void CThreadCommunicationDlg::OnBnClickedCancel()
{
 // TODO: 在此添加控件通知处理程序代码
 bThreadExit=TRUE;
 CDialogEx::OnCancel();
}

2、利用自定义消息进行通信

使用自定义消息来实现线程之间的通信也是以中行之有效的方法。使用自定义消息来进行线程之间的通信,首先要由用户定义一个消息:即


//自定义消息
const int WM_USRMSG=WM_USER+100;//WM_USER是有Windows系统定义的一个可以提供用户使用的消息号

详细的理解通过一个例子来理解:

例子:设计一个对话框的应用程序,程序的界面与上题一样。

实现:(1)用MFC创建基于对话框的应用程序

 

(2)在对话框的实现文件中定义一个全局变量

 

BOOL bThreadExit=FALSE;

(3)在对话框的头文件中添加自定义消息


//自定义消息
const int WM_USRMSG=WM_USER+100;//WM_USER是有Windows系统定义的一个可以提供用户使用的消息号

(4)在对话框的头文件中声明自定义消息响应函数

    //自定义消息响应函数
 afx_msg LRESULT OnThreadEnd(WPARAM wParam,LPARAM lParam);

(5)在对话框的实现文件中自定义消息映射

 //添加自定义消息映射
 ON_MESSAGE(WM_USRMSG,&CThreadCommunicationUsingMessageDlg::OnThreadEnd)

(6)在对话框的实现文件中实现自定义消息响应函数

//实现消息映射函数
LRESULT CThreadCommunicationUsingMessageDlg::OnThreadEnd(WPARAM wParam,LPARAM lParam)
{
 char* pmessage="线程结束";
 HWND hwnd=GetSafeHwnd();
 ::MessageBox(hwnd,pmessage,"message thread",MB_OK);
 return TRUE;
}

(7)在对话框实现文件中定义线程函数


//定义线程函数
UINT MessageThread(LPVOID pParam)
{
 int i=0;
 CString str;
 while(bThreadExit!=TRUE)
 {
  str.Format(_T("Wait Exit Times=%d"),i++);
  ::SetWindowText((HWND)pParam,str);
 }
 ::PostMessage((HWND)pParam,WM_USRMSG,0,0);//将消息放置到消息队列当中去
 /*char* pmessage="线程结束";
 CWnd* hwnd=AfxGetMainWnd();
 ::MessageBox(hwnd->m_hWnd,pmessage,"message thread",MB_OK);*/
 return 0;
}

(8)定义线程开始按钮的消息响应函数


void CThreadCommunicationUsingMessageDlg::OnBnClickedButton1()
{
 // TODO: 在此添加控件通知处理程序代码
 HWND hwnd=GetSafeHwnd();
 AfxBeginThread(MessageThread,
  hwnd,
  THREAD_PRIORITY_NORMAL);
}

(9)定义线程结束按钮的消息响应函数


void CThreadCommunicationUsingMessageDlg::OnBnClickedCancel()
{
 // TODO: 在此添加控件通知处理程序代码
 bThreadExit=TRUE;
 //CDialogEx::OnCancel();//在这里要注意没有把对话框取消了。
}

你可能感兴趣的:(线程通信)