想实现子线程和主线程之间相互通信,
比如住线程收到子线程的数据后,更新窗体控件中显示的数据等;
主窗体接收的话,是要先定义消息值,子线程中中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个,你缺少第一个句柄参数啊
::SendMessage是有4个参数的,你这里才3个,你缺少第一个句柄参数啊
#9
AfxBeginThread是MFC的,CreateThread是Win32 API,AfxBeginThread封装了CreateThread函数,在MFC程序中建议使用AfxBeginThread,C++程序建议使用_beginthreadex
#10
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个,你缺少第一个句柄参数啊
::SendMessage是有4个参数的,你这里才3个,你缺少第一个句柄参数啊
#9
AfxBeginThread是MFC的,CreateThread是Win32 API,AfxBeginThread封装了CreateThread函数,在MFC程序中建议使用AfxBeginThread,C++程序建议使用_beginthreadex
#10
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
谢谢楼上各位朋友的回复,问题已经解决。。。。