在线程中向文档类发送消息,如何附加参数?

lgchao 2004-04-11 01:56:07
如题
...全文
122 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluebohe 2004-04-12
  • 打赏
  • 举报
回复
文档不是窗口,向文档类发送消息有些力不从心,建议你把Frame或者View类的hWnd传给线程,这样的话你就可以向Frame或者View发送你自定义的消息了
lgchao 2004-04-12
  • 打赏
  • 举报
回复
决定采用发送CMainFrame的HWND给线程,线程向CMainFrame发送带参数的消息,CMainFrame对文档进行操作的方法。

明天结贴。
5512 2004-04-11
  • 打赏
  • 举报
回复
一会没进来,你们发这么多了,我没言语。关注!
lgchao 2004-04-11
  • 打赏
  • 举报
回复
如果是这样,不用通过线程参数传递文档指针的,可以在线程中通过(CMyDoc*)((CMainFrame*)AfxGetMainWnd())->GetActiveDocument();获得,但是这样要考虑对文档类成员操作的线程安全问题,我原本想通过PostMessage将这个问题交给系统。

如果没其他办法,也只能这样了,还好我一开始选择文档类的集合成员类型时选择了线程安全的。

还考虑过改写CDocument的OnCmdMsg虚函数来实现,似乎不太可行。
vcforever 2004-04-11
  • 打赏
  • 举报
回复
你可以在启动线程的时候将文档类的指针作为参数传递给线程函数!

AfxBeginThread(ThreadFun,文档类的指针);

//线程函数
UINT ThreadFun(LPVOID lparam)
{
CYourDoc* p = (CYourDoc*)lparam;
p->访问文档对象中的函数或成员
return 0;
}
lgchao 2004-04-11
  • 打赏
  • 举报
回复
这样是不行的

CDocument继承自CCmdTarget类,只能接收WM_COMMAND,它的消息处理函数原形为
afx_msg void OnMyCommand(void),不能带参数。
5512 2004-04-11
  • 打赏
  • 举报
回复
COPYDATASTRUCT pcds;
pcds.lpData=&(你的参数) /////要注意,若已经是指针则不要取地址符号&
::SendMessage(m_hWnd,WM_COPYDATA,0,(LPARAM) &pcds);

::SendMessage(m_hWnd,(你自己定义的消息名),0,(LPARAM) &pcds);
然后在发送的消息处理函数中将pcds指针转换成COPYDATASTRUCT型,
再把pcds.lpData指针转换成你的数据类型即可

15,471

社区成员

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

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