MFC 中如何给子线程发送消息

wang603603 2013-08-21 08:56:02
在下想要实现 线程之间的通信,发送消息是一种方法。
但是如何设置 ::PostMessage(...)的第一个参数呢。。?

void CMultiThread7Dlg::OnSum()
{
// TODO: 在此添加控件通知处理程序代码

//创建一个线程
m_pCalculateThread = new CCalculateThread();

m_pCalculateThread->CreateThread();
// m_pCalculateThread = (CCalculateThread*)
// AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
//m_pCalculateThread->PostThreadMessage(WM_CALCULATE,m_nNum, NULL);


Sleep(500);

::PostMessage(m_pCalculateThread->m_pMainWnd->m_hWnd ,WM_CALCULATE, 1000, NULL) ;
}



@1 使用AfxBeginThread(...) 提示内存不足。。?
@2 在使用CreateThread() 后,就没有提示 内存不足了,但是PostMessage(...)第一个形参又如何去设置了,我写的也不对[m_pCalculateThread->m_pMainWnd->m_hWnd]。
...全文
634 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang603603 2013-08-27
  • 打赏
  • 举报
回复
多谢各位的积极回答,问题已经自己解决了! @1 提示‘内存不足’是 因为在 线程类中没有 添加 宏

 DECLARE_DYNCREATE(CCalculateThread)
 IMPLEMENT_DYNCREATE(CCalculateThread, CWinThread)
@2 线程类无法收到 主对话发送的消息时应为, 在线程类中, 没有重写

	virtual BOOL InitInstance();
	virtual int ExitInstance();
且在BOOL InitInstance()中 不能简单的 return CWinThread::InitInstance(), 必须 return true.
wang603603 2013-08-24
  • 打赏
  • 举报
回复
引用 12 楼 wjjll123 的回复:
[quote=引用 11 楼 wang603603 的回复:] [quote=引用 10 楼 wjjll123 的回复:] CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread)); cct定义全局的,然后直接调用函数。。。看看可以不可以

CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。[/quote] 我代码里面就这么写的。完全没有问题。。。[/quote] 阁下能否把 源代码 发给我 272180850@qq.com ,以便结贴。
mrluoluo 2013-08-23
  • 打赏
  • 举报
回复
mark...
wjjll123 2013-08-22
  • 打赏
  • 举报
回复
new CCalculateThread这句话去掉呢?
wang603603 2013-08-22
  • 打赏
  • 举报
回复
引用 12 楼 wjjll123 的回复:
[quote=引用 11 楼 wang603603 的回复:]
[quote=引用 10 楼 wjjll123 的回复:]
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以



CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));

全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。[/quote]
我代码里面就这么写的。完全没有问题。。。[/quote]
点击了求和按钮, 直接进了 OnSum() 函数。。
mujiok2003 2013-08-22
  • 打赏
  • 举报
回复
子线程没有消息泵吧? The function fails if the specified thread does not have a message queue. The system creates a thread's message queue when the thread makes its first call to one of the User or GDI functions. For more information, see the Remarks section. 还是使用消息对列(自己实现或用ms message queue)吧.
wjjll123 2013-08-22
  • 打赏
  • 举报
回复
引用 11 楼 wang603603 的回复:
[quote=引用 10 楼 wjjll123 的回复:] CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread)); cct定义全局的,然后直接调用函数。。。看看可以不可以

CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。[/quote] 我代码里面就这么写的。完全没有问题。。。
wang603603 2013-08-22
  • 打赏
  • 举报
回复
引用 10 楼 wjjll123 的回复:
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread)); cct定义全局的,然后直接调用函数。。。看看可以不可以

CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。
wjjll123 2013-08-22
  • 打赏
  • 举报
回复
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread)); cct定义全局的,然后直接调用函数。。。看看可以不可以
wjjll123 2013-08-22
  • 打赏
  • 举报
回复
CCalculateThread* CCalculateThread= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread)); 试试看呢
wang603603 2013-08-22
  • 打赏
  • 举报
回复
引用 5 楼 wjjll123 的回复:
接受消息的代码怎么写的?
在子线程中的消息响应函数和 在主对话框中的 自定义消息 怎么不一样啊(这个例子是我看资料上的)? 子线程的那个类是继承与 CWindThread 类的。 结果 消息响应函数的返回值为 @1void ,(在主对话框中的 消息响应函数的返回值为 LRESULT),

BEGIN_MESSAGE_MAP(CCalculateThread, CWinThread)
  @2 ON_MESSAGE(WM_DisPlay, OnDisplay)	
  ON_THREAD_MESSAGE(WM_CALCULATE, OnCalculate)	
END_MESSAGE_MAP();
上面有两处不一样 @1 和@2 会不会有影响。。?
赵4老师 2013-08-22
  • 打赏
  • 举报
回复
Spy++软件会用吗? 《Windows核心编程》
wang603603 2013-08-22
  • 打赏
  • 举报
回复
引用 5 楼 wjjll123 的回复:
接受消息的代码怎么写的?

void CCalculateThread::OnCalculate(WPARAM wParam,LPARAM lParam)
{ 
   int nTemp = 0;
   for (int i = 1; i<=(int)wParam; i++ )
   {
	   nTemp += i;
   }

   Sleep(100);
   
   ::PostMessage((AfxGetMainWnd()->GetSafeHwnd()),WM_DISPLAY, nTemp, NULL) ;
  
    return ;
}
WM_DISPLAY 在主要窗口中已经定义了。 如果把 ::PostMessage((AfxGetMainWnd()->GetSafeHwnd()),WM_DISPLAY, nTemp/*100*/, NULL) ; 放在 住窗口的void CMultiThread7Dlg::OnSum(); 函数中去调用是没有问题的, 也就是说 子线程中 发送的消息是没有问题的, 只是在 主对话框中 消息没有发送成功,导致我的子线程消息响应函数没有被 触发。。。。
wjjll123 2013-08-22
  • 打赏
  • 举报
回复
接受消息的代码怎么写的?
wang603603 2013-08-22
  • 打赏
  • 举报
回复
引用 1 楼 Qyee16 的回复:
BOOL PostThreadMessage( DWORD idThread, UINT Msg, WPARAM wParam, LPARAM lParam );
照着做了, 但是 子线程 介绍不到消息,,,!发现断点进不去。。。
midle110 2013-08-21
  • 打赏
  • 举报
回复
m_pCalculateThread.PostMessage(WM_QUIT,0,0);
Qyee16 2013-08-21
  • 打赏
  • 举报
回复
idThread为目标线程的id
Qyee16 2013-08-21
  • 打赏
  • 举报
回复
BOOL PostThreadMessage( DWORD idThread, UINT Msg, WPARAM wParam, LPARAM lParam );

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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