一般可以有两种方式来实现线程间通信: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();//在这里要注意没有把对话框取消了。
}