线程发消息,接收问题

sgdgoodboy 2007-07-02 10:56:27
单文档程序:我做了个线程
DWORD WINAPI CPassView::RecvProc(LPVOID lpParameter)
{
...
//发送了一个消息
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)pRecvBuf);
}
消息接收我加了:
BEGIN_MESSAGE_MAP(CPassView, CScrollView)
//{{AFX_MSG_MAP(CPassView)
ON_COMMAND(ID_NETWORK_RECVDATA, OnNetworkRecvdata)
ON_COMMAND(ID_NETWORK_STOPRECV, OnNetworkStoprecv)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_RECVDATA,OnRecvData)
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
定义我加了:
#define WM_RECVDATA WM_USER+1
...
protected:
//{{AFX_MSG(CPassView)
afx_msg void OnNetworkRecvdata();
afx_msg void OnNetworkStoprecv();
//}}AFX_MSG
afx_msg void OnRecvData(WPARAM wParam ,LPARAM lParam);
DECLARE_MESSAGE_MAP()

怎么就是进不了我的 消息处理函数呢?:
void CPassView::OnRecvData(WPARAM wParam, LPARAM lParam)

以前在Dialog下是可以接到的,难道是因为类的问题,还是我传的hwnd不对呢?
请教各位大哥\大虾了!
...全文
466 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sgdgoodboy 2007-07-17
  • 打赏
  • 举报
回复
谢谢各位了!确实是hWnd的问题!
kenny9931 2007-07-16
  • 打赏
  • 举报
回复
可以得到m_hWnd 呀,每个窗体类都有这个成员。

CWnd *hwnd= (CWnd*)lpParameter;
::PostMessage(hwnd->m_hWnd,WM_RECDATA,0,(LPARAM)pRecvBuf);
red_berries 2007-07-13
  • 打赏
  • 举报
回复
楼上的不行吧 PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)pRecvBuf);中的hwnd是HWND类型的不是CWND类型的,这个hwdn应该是视图类CPassView的主窗口,可以在CPassView类中使用this->m_hWnd 获得这个窗口的句柄将其传递给线程
kenny9931 2007-07-13
  • 打赏
  • 举报
回复
问题在于这个hwnd是怎么获取的?
用下面试试,一定行的。

CWnd *hwnd= (CWnd*)lpParameter;
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)pRecvBuf);
red_berries 2007-07-13
  • 打赏
  • 举报
回复
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)pRecvBuf);
这个hwnd是怎么获取的?
czfY_zhou 2007-07-13
  • 打赏
  • 举报
回复
That's easy!!
hwnd 一定不是你想收到消息的窗口的 句柄.
建议用 ::SendMessage 发送一个不进队的消息!!!!!
sgdgoodboy 2007-07-09
  • 打赏
  • 举报
回复
我也认为是 HWND的问题 从前在对话框是可用的,难道单文档就不行了么?
wfenj 2007-07-07
  • 打赏
  • 举报
回复
我认为是HWND的问题
xtaddqqug 2007-07-07
  • 打赏
  • 举报
回复
用SendMessage,如果您的程序太忙了,用PostMessage延迟比较大,甚至被丢弃
johnxt 2007-07-06
  • 打赏
  • 举报
回复
楼上回答不对,即使是free了,消息函数大不了会访问到非法的内存块,也不至于进不了消息响应函数的。我认为楼主是不是窗口句柄有误,消息发到其它窗口了。你可以将你的代码发给我:kempniu@gmail.com,我帮你看看
Y神圣 2007-07-06
  • 打赏
  • 举报
回复
我的看法是这样:你将pRecvBuf发送过去,然后子线程就回收了内存.这个时候主线程可能刚刚才开始处理你的WM_RECVDATA消息,于是找不到任何东西,你这样,sleep()一下,看可不可以收到.我一般是将回收交给主线程回收.
sgdgoodboy 2007-07-05
  • 打赏
  • 举报
回复
我把消息映射的函数都贴给你看
if(bFlag == 0)
{
LPTSTR pRecvBuf = NULL;
pRecvBuf = (LPTSTR)LocalAlloc(LPTR,650 * sizeof(char));
if( pRecvBuf == NULL )
{
AfxMessageBox("接收端内存申请失败!");
}

int retval;
//接收数据并用retval返回接收数据的长度
retval = recvfrom(sock,pRecvBuf,650,0,(SOCKADDR*)&addrFrom,&len);
if(SOCKET_ERROR == retval)
break;
//判断是否为一贞
g_Row = *(char*)pRecvBuf;
pRecvBuf+=10;
//

//用消息的模式把数据传递给对话框
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)pRecvBuf);
LocalFree(pRecvBuf);
}
sgdgoodboy 2007-07-05
  • 打赏
  • 举报
回复
我用的是HWND型 并且做了个全局结构体,放在里面
如果是CWnd型会怎么样呢? 区别会 是怎样?
red_berries 2007-07-04
  • 打赏
  • 举报
回复
DWORD WINAPI CPassView::RecvProc(LPVOID lpParameter)
{
...
//发送了一个消息
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)pRecvBuf);
}
////////////////////////////////////////////
这个函数帖全点
sgdgoodboy 2007-07-03
  • 打赏
  • 举报
回复
晕了!
问题简单也不要袖手旁观啊!各位大哥!
Y神圣 2007-07-03
  • 打赏
  • 举报
回复
你重载WndMsgProc看看。
SJcinux 2007-07-03
  • 打赏
  • 举报
回复
你传的hWnd是HWND型还是CWnd型的,在多线程中要注意MFC对象跨线程调用的问题,你的问题可能就出在对象跨线程调用问题上。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧