MFC中线程间通信--主线程与子线程间的通信

第0步:声明一个线程、一个事件

CWinThread* m_hThread;				//接收线程的句柄
HANDLE hStartEven;                  //

第一步:定义自己的消息

#define MY_MESSAGE WM_USER+100

第二步:在发送消息的线程中

//得到需要传输的数据
    CString str;
	GetDlgItemTextW(IDC_OFFSET_V,str);

//将传输的数据转化成char*
	char *ch = new char[10];
	WideCharToMultiByte(CP_ACP,0,str,-1,ch,10,NULL,NULL);
    
//创建Event对象,让PostThreadMessage等待目标线程创建一个消息队列
	hStartEven = ::CreateEventA(0,FALSE,FALSE,0);
	if (hStartEven == 0)
	{
		printf("create start event failed,error:%d\n",::GetLastError());
		return;
	}

	if(m_hThread == 0)
	{
		printf("start thread failed,errno:%d\n",::GetLastError());
		CloseHandle(hStartEven);
		return ;
	}
	
//不断调用PostThreadMessage函数,直到函数成功。 这是因为当线程收到这样的函数以后,
//会自动创建消息队列。
	while(!m_hThread->PostThreadMessage(UM_MESSAGE,(WPARAM)ch,0))
	{
		Sleep(10);

		delete[] ch;
	}

第三部:在接收消息的线程中

	MSG msg;
    //目标线程通过调用PeekMessage强制系统创建一个消息队列
	PeekMessage(&msg,NULL,WM_USER+100,WM_USER+100,PM_NOREMOVE);
    //判断是否有消息传递过来
	if (!SetEvent(hStartEven))
	{
		printf("set start event failed,errno:%d\n",::GetLastError());
		return 1;
	}
    
    //如果发送的消息是不间断的,则用while进行接收;如果是有条件发送,则采用判断语言if进行接收
    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;
			}
		}
    }
						

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页