MFC线程间通信

一、主线程与子线程通信

方法一:

第一步:#define WM_RECVDATA WM_USER+100
WM_USER不一定+100,只要大于WM_USER即可,但要注意不可与其他的自定义消息冲突

1、子线程(要发送消息的线程)

    CString str; //将传输的数据转化  成char* 
    char *ch = new char[10]; 
    WideCharToMultiByte(CP_ACP,0,str,-1,ch,10,NULL,NULL);
    //不断调用PostThreadMessage函数,直到函数成功。 这是因为当线程收到这样的函数以后,
    //会自动创建消息队列。 
    while(!::PostThreadMessage(WM_RECVDATA,(WPARAM)ch,0)) 
    {   Sleep(10);   
    	delete[] ch; 
    }
   //此处也可设置全局变量传值,只利用此函数触发主线程函数进行消息处理

2、主线程(接收消息的线程)
重写BOOL VeinDemoDlg::PreTranslateMessage(MSG* pMsg)

BOOL VeinDemoDlg::PreTranslateMessage(MSG* pMsg) 
{
    //目标线程通过调用PeekMessage强制系统创建一个消息队列	
    PeekMessage(pMsg,NULL,WM_USER+100,WM_USER+100,PM_NOREMOVE);
    //如果是有条件发送,则采用判断语言if进行接收
    if(pMsg->message == WM_RECVDATA)
    {
        //此处添加消息处理函数
    }
   //如果发送的消息是不间断的,则用while进行接收

    while(true)    
    {        
        if (GetMessage(&msg,0,0,0))  
        {   switch (msg.message)   
            {   
            case UM_MESSAGE:    
                char *pch = (char*)msg.wParam;        
                m_offset_v = atof(pch);//添加消息处理函数   
                delete[] pch;   
                break;   
             }  
         }    
     }
    return CDialog::PreTranslateMessage(pMsg);
}
BOOL PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg);

LPMSG lpMsg:消息的地址
HWND hWnd:视窗的句柄
UINT wMsgFilterMin, UINT wMsgFilterMax:两个值指示消息范围(都为0或NULL表示传回所有消息
UINT wRemoveMsg:PM_REMOVE将消息从消息队列中删除,PM_NOREMOVE保留消息从在消息队列中

参考:https://blog.csdn.net/m0_37884601/article/details/84639830

方法二(推荐):

在MFC中测试通过
在同一个.cpp中

#define   WM_CAPTURE_HINT     WM_USER  + 14
BEGIN_MESSAGE_MAP(VeinDemoDlg, CDialog)
    //{{AFX_MSG_MAP(VeinDemoDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_CLOSE, OnClose)
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_CAPTURE_HINT, OnCaptureHint)//注意这一条,用于传递消息
END_MESSAGE_MAP()

LRESULT VeinDemoDlg::OnCaptureHint(WPARAM wParam, LPARAM lParam)
{
     char * strMessage = (char*)wParam;
     //在此可以添加消息处理程序,和主线程中的函数使用相同
     LogMessage(strMessage);

     delete [] strMessage;
     return 0;
}
DWORD WINAPI VeinDemoDlg::MatchProc(LPVOID param)
{
     VeinDemoDlg * mainWindow = (VeinDemoDlg *)param;
     mainWindow->LogMessageInThread("HelloWorld!");
}
void VeinDemoDlg::LogMessageInThread(char * strFmt, ...)
{
     char tempMsg[1024];
     CString outMsg = "";
     /*---获取参数列表---*/
     va_list argp;
     va_start(argp, strFmt);
     /*---格式化的数据输出到指定的数据流中---*/
     _vsnprintf_s(tempMsg, 1024,strFmt, argp);
     a_end(argp);
     outMsg += tempMsg;
     char * strMessage = new char[outMsg.GetLength() + 1];
     strcpy(strMessage , (const char*)outMsg.GetBuffer(0));
     ::PostMessage(GetSafeHwnd(),WM_CAPTURE_HINT,(WPARAM)strMessage,(LPARAM)0);
}
 
void VeinDemoDlg::LogMessage(char * strFmt, ...)
{
     SYSTEMTIME st;
     GetLocalTime(&st);
     char CurTime[64] = { '\0' };
     char tempMsg[1024];
     CString outMsg;
     sprintf_s(CurTime, "%02d:%02d:%02d.%03d  ",st.wHour,st.wMinute,st.wSecond,st.wMilliseconds);
     outMsg = CurTime;
      /*---获取参数列表---*/
     va_list argp;
     va_start(argp, strFmt);
     /*---格式化的数据输出到指定的数据流中---*/
     _vsnprintf_s(tempMsg, 1024,strFmt, argp);
     va_end(argp);
     outMsg += tempMsg;
     m_msgList.InsertString(0,outMsg);
}


 

二、线程间通信的三种方法

可参考该博文:https://blog.csdn.net/cbnotes/article/details/8516703

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC(Microsoft Foundation Classes)是微软公司为Windows操作系统开发的一套面向对象的C++类库。它能够使开发者更轻松地创建Windows图形用户界面(GUI)应用程序。 在MFC中,实现多串口通信可以通过使用CSerialPort类来实现。CSerialPort类封装了串口的操作,可以通过调用其方法来打开、关闭、读取和写入串口数据。 而要实现多线程,则可以利用MFC提供的CWinThread类。通过创建多个CWinThread对象,每个对象分别处理一个串口的通信任务。每个CWinThread对象使用独立的线程来执行任务,以避免阻塞主线程。 具体实现步骤如下: 1. 创建一个主线程,用于处理用户界面和整体程序的控制逻辑。 2. 创建多个CWinThread对象,每个对象分别处理一个串口通信任务。 3. 在每个CWinThread对象中,使用CSerialPort类的实例进行串口的打开、配置、读取和写入等操作。 4. 确保每个CWinThread对象都在独立的线程中执行任务,以防止串口通信阻塞主线程。 5. 如果需要在主线程中对串口通信的数据进行处理,可以使用MFC提供的同步机制来保证数据的正确访问。 总结起来,使用MFC实现多串口多线程的步骤主要包括创建主线程和多个CWinThread对象、配置串口参数、在每个CWinThread对象中进行串口通信操作,并进行数据的同步处理。这样可以使程序具备同时处理多个串口通信任务的能力。 ### 回答2: MFC是Microsoft Foundation Classes的简称,它是一个用于创建Windows应用程序的C++类库。多串口是指在一个应用程序中同时使用多个串口进行通信的功能。多线程是指在一个应用程序中同时运行多个线程的能力。 在MFC中实现多串口功能可以通过使用串口类(CSerialPort)和线程类(CWinThread)来实现。首先,我们可以创建多个CSerialPort对象,每个对象代表一个串口。然后,可以使用CWinThread创建多个线程,每个线程负责处理一个串口的通信操作。 在每个线程中,可以使用CSerialPort对象进行串口通信。每个线程通过调用CSerialPort类的成员函数来打开、关闭、发送和接收数据。可以使用线程同步机制(如事件、临界区或互斥量)来避免多个线程同时访问同一个串口对象。 在多线程环境下使用MFC多串口功能需要注意以下几点: 1. 使用线程同步机制来保证多个线程对同一个串口对象的访问安全; 2. 避免多个线程同时发送数据到同一个串口,以避免数据冲突; 3. 合理分配串口和线程资源,避免资源竞争和性能瓶颈; 4. 注意处理串口通信错误和异常情况,保证程序的稳定性和可靠性。 总之,借助MFC的类库,我们可以很方便地实现多串口多线程功能,提高应用程序的通信效率和并发处理能力。但在并发操作时,需要注意线程安全和资源管理等问题,以确保应用程序的稳定性和可靠性。 ### 回答3: MFC是由Microsoft开发的用于Windows操作系统的应用程序框架,它提供了许多用于开发图形用户界面的类和功能。多串口是指在一个应用程序中同时控制多个串口设备的能力。而多线程是指在一个应用程序中同时运行多个线程的能力。 在MFC中实现多串口控制涉及到串口通信的操作,可以使用MFC提供的CSerialPort类来进行串口的打开、读取和写入操作。对于多个串口设备,可以创建多个CSerialPort对象来分别控制每个串口。 而要在MFC中实现多线程,可以使用MFC提供的CWinThread类来创建和管理线程。可以通过创建多个CWinThread对象来实现多个并发运行的线程。每个线程可以执行不同的任务,通过线程间的通信和同步机制来实现数据的共享和协调。 在实现MFC多串口多线程时,可以将每个串口设备的控制逻辑分别放在不同的线程中运行,使得每个串口都可以独立地进行读取和写入操作。同时,还可以利用多线程的特性,实现同步和异步的串口通信,提高程序的效率和响应性。 总之,MFC多串口多线程的实现可以通过使用MFC提供的相关类和功能来实现。通过合理地组织和管理多个串口设备和线程,可以实现并发运行的串口通信任务,提高应用程序的灵活性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值