zoukankan      html  css  js  c++  java
  • MFC 多线程-MFC工作者线程向主线程传递消息

    https://blog.csdn.net/zhuyonghao123/article/details/8167186

    MFC工作者线程向主线程传递消息:

            我们在编写VC网络应用程序时,经常会用到2个线程,一个是主线程,主线程负责与界面相关的工作;一个是网络接收线程,负责接收网路上的数据,它在后台工作,接收线程经常需要与主线程进行交互,例如接收到的数据要显示在窗口中等。由于工作者线程没有消息队列和消息循环,因此它不能接收和处理消息,只能发送消息。

    先定义一个结构体用于参数传输

    struct RECVPARAM{

           SOCKET sock;             //已创建的套接字

           HWND hwnd;               //对话框句柄

    };

    RECVPARAM *pRecvParam = new RECVPARAM;

    pRecvParam->sock = m_sock;

    pRecvParam->hwnd = m_hWnd;

    创建接收线程

    HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);

    线程入口函数为全局函数或静态类成员函数

    DWORD WINAPI RecvProc(LPVOID lpParameter);                       //全局函数

    static DWORD WINAPI RecvProc(LPVOID lpParameter);              //静态类成员函数(声明)

    DWORD WINAPI CchatDlg::RecvProc(LPVOID lpParameter)        //静态类成员函数(实现)

    {

           SOCKET sock=((RECVPARAM*)lpParameter)->sock;

           HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;

           char recvBuf[200];

           char tempBuf[300];

           while(1)

           {

                    //接收数据

                    …

                    //发送到主线程

                    sprintf(tempBuf,”%s 说: %s”,inet_ntoa(addrFrom.sin_addr),recvBuf);

                    ::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);

                    //给界面发送消息(主线程)

            }

    }

    窗口类头文件中添加消息定义

           #define WM_RECVDATA      WN_USER+1

    声明消息响应函数

    afx_msg void OnRecvData(WPARAM wParam,LPARAM lParam);

    添加消息映射

    ON_MESSAGE(WM_RECVDATA,OmRecvData)

    定义消息响应函数

    void CchatDlg::OnRecvData(WPARAM wParam, LPARAM lParam)

    {

           Cstring str = (char*)lParam;

           Cstring strTemp;

           //获取已有数据

           GetDlgTiemText(IDC_EDIT_RECV,strTemp);

           str += “ ”;

           str + strTemp;

           //显示所有数据

           SetDlgItemText(IDC_EDIT_RECV,str);

    }

  • 相关阅读:
    Linux中查找当前目录下占用空间最大的前10个文件
    Redis的优势和特点
    java中final,finally,finalize三个关键字的区别
    消息队列介绍
    Redis的应用场景
    Spring中@Autowired注解与@Resource注解的区别
    多版本并发控制(MVCC)
    Linux查看CPU和内存使用情况
    进程调度算法
    一致性Hash算法
  • 原文地址:https://www.cnblogs.com/CipherLab/p/13754790.html
Copyright © 2011-2022 走看看