zoukankan      html  css  js  c++  java
  • 线程通信

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

  • 相关阅读:
    Nginx负载均衡+代理+ssl+压力测试
    Nginx配置文件详解
    HDU ACM 1690 Bus System (SPFA)
    HDU ACM 1224 Free DIY Tour (SPFA)
    HDU ACM 1869 六度分离(Floyd)
    HDU ACM 2066 一个人的旅行
    HDU ACM 3790 最短路径问题
    HDU ACM 1879 继续畅通工程
    HDU ACM 1856 More is better(并查集)
    HDU ACM 1325 / POJ 1308 Is It A Tree?
  • 原文地址:https://www.cnblogs.com/ljy2013/p/3558503.html
Copyright © 2011-2022 走看看