您的位置:首页 > 其它

线程通信

2015-08-21 08:45 323 查看
一般可以有两种方式来实现线程间通信: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();//在这里要注意没有把对话框取消了。
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: