• 线程通信


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

  • 相关阅读:
    上下文的哲学思考:上下文=环境 & 上下文=对象+行为+环境
    程序的上下文
    keyword:react native bridge
    深入理解react-native
    Xamarin vs React Native vs Ionic vs NativeScript: Cross-platform Mobile Frameworks Comparison
    脱离 WebView 的通信 JavaScriptCore
    v8引擎详解(摘)-- V8引擎是一个JavaScript引擎实现
    js、jscore与webkit、nodejs的关系
    JavaScriptCore在浏览器引擎中的位置
    正在开发的JavaScript引擎有哪些?
  • 原文地址:https://www.cnblogs.com/ljy2013/p/3558503.html
Copyright © 2020-2023  润新知