[急切求助]对话框窗体主线程和创建的子线程通信问题?

时间:2022-01-22 18:21:25
因为在窗体主线程中(Button按纽事件)启动一个子线程序,
想实现子线程和主线程之间相互通信,
比如住线程收到子线程的数据后,更新窗体控件中显示的数据等;

主窗体接收的话,是要先定义消息值,子线程中中PostMessage,
主线程中在消息回调函数中来接收?

请熟悉的朋友帮忙介绍下,谢谢。。。

13 个解决方案

#1


通过PostMessage/SendMessage中的最后的两个参数WPARAM,LPARAM来传递数据

#2


//比如在子线程中
UINT __cdecl ThreadProc(LPVOID lParam)
{
 HWND hWnd = (HWND)lParam;
 ASSERT(hWnd);
 //...
 //...
 SendMessage(UM_MESSAGE, (WPARAM)0, (LPARAM)(_T("Hello,World")); // 这里要用SendMessage,不是PostMessage
 return 0;
}
// 接收UM_MESSAGE的消息处理函数,这里wParam参数没有使用
LRESULT CXXX::OnMessage(WPARAM wParam, LPARAM lParam)
{
 LPCTSTR lpszText = (LPCTSTR)lParam;
 AfxMessageBox(lpszText);
 return 0;
}

#3


谢谢楼上朋友的回复,
我抓紧试下看看...

#4


//用下面的代码,实现子线程向主线程发消息时,
//SendMessage编译不通过,SendMessageA该如何传参数呢?

////////////////////////////////////////////
// thrdTestDlg.h : header file

class CThrdTestDlg : public CDialog
{
// Implementation
public:
//线程相关函数和参数
HANDLE hThrd;    //线程句柄
DWORD dwID;      //线程ID
bool Start(void* lParam);       //线程功能函数
static DWORD WINAPI StartThrd(LPVOID pParam); //线程入口函数
}

////////////////////////////////////////////
// thrdTestDlg.cpp : implementation file

// CAboutDlg dialog used for App About
#define  UM_MESSAGE 2010 //接受消息用的消息值

//启动线程
void CThrdTestDlg::OnButton1() 
{
  hThrd = CreateThread(NULL, 0, StartThrd, this, 0, &dwID); 
}

//线程入口函数
DWORD WINAPI CThrdTestDlg::StartThrd(void* pParam)
{
ASSERT(pParam);
CThrdTestDlg * pController = (CThrdTestDlg*)pParam;
pController->Start(pParam); 

return 0;
}

//线程功能函数
bool CThrdTestDlg::Start(void* lParam)
{
AfxMessageBox("线程启动"); 

HWND hWnd = (HWND)lParam;
ASSERT(hWnd);
CString str = "Hello,World";
LPARAM  sendMsg =  (LPARAM)((LPCTSTR)str); 

//SendMessageA' : function does not take 3 parameters
::SendMessage(UM_MESSAGE,(WPARAM)0,sendMsg); 

//CWnd::SendMessageA' : illegal call of non-static member function
//SendMessage(UM_MESSAGE,(WPARAM)0,sendMsg); 

return TRUE;
}

#5


创建线程时,在参数里传this指针

#6


AfxBeginThread创建线程,线程函数传递HWND窗口句柄

#7


CreateThread和AfxBeginThread,
创建线程有比较大的区别么?

#8


::SendMessage(UM_MESSAGE,(WPARAM)0,sendMsg); 这句话有问题啊

::SendMessage是有4个参数的,你这里才3个,你缺少第一个句柄参数啊

#9


引用 7 楼 hello_wrorld_2010 的回复:
CreateThread和AfxBeginThread,
创建线程有比较大的区别么?

AfxBeginThread是MFC的,CreateThread是Win32 API,AfxBeginThread封装了CreateThread函数,在MFC程序中建议使用AfxBeginThread,C++程序建议使用_beginthreadex

#10


引用 7 楼 hello_wrorld_2010 的回复:
CreateThread和AfxBeginThread,
创建线程有比较大的区别么?


CreateThread这个 函数是windows提供给用户的 API函数,是SDK的标准形式,在使用的过程中要考虑到进程的同步与互斥的关系,进程间的同步互斥等一系列会导致操作系统死锁的因素,用起来比较繁琐一些,初学的人在用到的时候可能会产生不可预料的错误,建议多使用AfxBeginThread,是编译器对原来的CreateThread函数的封装,用与MFC编程(当然,只要修改了项目属性,console和win32项目都能调用)而_beginthread是C的运行库函数。 

在使用AfxBeginThread时,线程函数的定义为:UINT   _yourThread(LPVOID   pParam)参数必须如此

在使用CreateThread时,线程的函数定义为: DWORD WINAPI _yourThread(LPVOID pParameter)

#11


在使用AfxBeginThread时,线程函数的定义为:UINT _yourThread(LPVOID pParam)参数必须如此

在使用CreateThread时,线程的函数定义为: DWORD WINAPI _yourThread(LPVOID pParameter)

#12


//在使用AfxBeginThread时,线程函数的定义为:
UINT _yourThread(LPVOID pParam)参数必须如此

//在使用CreateThread时,线程的函数定义为: 
DWORD WINAPI _yourThread(LPVOID pParameter)

#13


谢谢楼上各位朋友的回复,问题已经解决。。。。

#1


通过PostMessage/SendMessage中的最后的两个参数WPARAM,LPARAM来传递数据

#2


//比如在子线程中
UINT __cdecl ThreadProc(LPVOID lParam)
{
 HWND hWnd = (HWND)lParam;
 ASSERT(hWnd);
 //...
 //...
 SendMessage(UM_MESSAGE, (WPARAM)0, (LPARAM)(_T("Hello,World")); // 这里要用SendMessage,不是PostMessage
 return 0;
}
// 接收UM_MESSAGE的消息处理函数,这里wParam参数没有使用
LRESULT CXXX::OnMessage(WPARAM wParam, LPARAM lParam)
{
 LPCTSTR lpszText = (LPCTSTR)lParam;
 AfxMessageBox(lpszText);
 return 0;
}

#3


谢谢楼上朋友的回复,
我抓紧试下看看...

#4


//用下面的代码,实现子线程向主线程发消息时,
//SendMessage编译不通过,SendMessageA该如何传参数呢?

////////////////////////////////////////////
// thrdTestDlg.h : header file

class CThrdTestDlg : public CDialog
{
// Implementation
public:
//线程相关函数和参数
HANDLE hThrd;    //线程句柄
DWORD dwID;      //线程ID
bool Start(void* lParam);       //线程功能函数
static DWORD WINAPI StartThrd(LPVOID pParam); //线程入口函数
}

////////////////////////////////////////////
// thrdTestDlg.cpp : implementation file

// CAboutDlg dialog used for App About
#define  UM_MESSAGE 2010 //接受消息用的消息值

//启动线程
void CThrdTestDlg::OnButton1() 
{
  hThrd = CreateThread(NULL, 0, StartThrd, this, 0, &dwID); 
}

//线程入口函数
DWORD WINAPI CThrdTestDlg::StartThrd(void* pParam)
{
ASSERT(pParam);
CThrdTestDlg * pController = (CThrdTestDlg*)pParam;
pController->Start(pParam); 

return 0;
}

//线程功能函数
bool CThrdTestDlg::Start(void* lParam)
{
AfxMessageBox("线程启动"); 

HWND hWnd = (HWND)lParam;
ASSERT(hWnd);
CString str = "Hello,World";
LPARAM  sendMsg =  (LPARAM)((LPCTSTR)str); 

//SendMessageA' : function does not take 3 parameters
::SendMessage(UM_MESSAGE,(WPARAM)0,sendMsg); 

//CWnd::SendMessageA' : illegal call of non-static member function
//SendMessage(UM_MESSAGE,(WPARAM)0,sendMsg); 

return TRUE;
}

#5


创建线程时,在参数里传this指针

#6


AfxBeginThread创建线程,线程函数传递HWND窗口句柄

#7


CreateThread和AfxBeginThread,
创建线程有比较大的区别么?

#8


::SendMessage(UM_MESSAGE,(WPARAM)0,sendMsg); 这句话有问题啊

::SendMessage是有4个参数的,你这里才3个,你缺少第一个句柄参数啊

#9


引用 7 楼 hello_wrorld_2010 的回复:
CreateThread和AfxBeginThread,
创建线程有比较大的区别么?

AfxBeginThread是MFC的,CreateThread是Win32 API,AfxBeginThread封装了CreateThread函数,在MFC程序中建议使用AfxBeginThread,C++程序建议使用_beginthreadex

#10


引用 7 楼 hello_wrorld_2010 的回复:
CreateThread和AfxBeginThread,
创建线程有比较大的区别么?


CreateThread这个 函数是windows提供给用户的 API函数,是SDK的标准形式,在使用的过程中要考虑到进程的同步与互斥的关系,进程间的同步互斥等一系列会导致操作系统死锁的因素,用起来比较繁琐一些,初学的人在用到的时候可能会产生不可预料的错误,建议多使用AfxBeginThread,是编译器对原来的CreateThread函数的封装,用与MFC编程(当然,只要修改了项目属性,console和win32项目都能调用)而_beginthread是C的运行库函数。 

在使用AfxBeginThread时,线程函数的定义为:UINT   _yourThread(LPVOID   pParam)参数必须如此

在使用CreateThread时,线程的函数定义为: DWORD WINAPI _yourThread(LPVOID pParameter)

#11


在使用AfxBeginThread时,线程函数的定义为:UINT _yourThread(LPVOID pParam)参数必须如此

在使用CreateThread时,线程的函数定义为: DWORD WINAPI _yourThread(LPVOID pParameter)

#12


//在使用AfxBeginThread时,线程函数的定义为:
UINT _yourThread(LPVOID pParam)参数必须如此

//在使用CreateThread时,线程的函数定义为: 
DWORD WINAPI _yourThread(LPVOID pParameter)

#13


谢谢楼上各位朋友的回复,问题已经解决。。。。