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

时间:2023-01-18 21:11:53
在下想要实现 线程之间的通信,发送消息是一种方法。
但是如何设置 ::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]。

18 个解决方案

#1


BOOL PostThreadMessage( DWORD idThread,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
);

#2


idThread为目标线程的id

#3


 m_pCalculateThread.PostMessage(WM_QUIT,0,0);

#4


引用 1 楼 Qyee16 的回复:
BOOL PostThreadMessage( DWORD idThread,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
);

 照着做了, 但是 子线程 介绍不到消息,,,!发现断点进不去。。。

#5


接受消息的代码怎么写的?

#6


引用 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(); 函数中去调用是没有问题的,
  也就是说 子线程中 发送的消息是没有问题的, 只是在 主对话框中 消息没有发送成功,导致我的子线程消息响应函数没有被 触发。。。。

#7


Spy++软件会用吗?
《Windows核心编程》

#8


引用 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 会不会有影响。。?
  

#9


CCalculateThread* CCalculateThread= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
试试看呢

#10


CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以

#11


引用 10 楼 wjjll123 的回复:
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以



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

全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。

#12


引用 11 楼 wang603603 的回复:
Quote: 引用 10 楼 wjjll123 的回复:

CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以



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

全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。

我代码里面就这么写的。完全没有问题。。。

#13


子线程没有消息泵吧?
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)吧. 

#14


引用 12 楼 wjjll123 的回复:
Quote: 引用 11 楼 wang603603 的回复:

Quote: 引用 10 楼 wjjll123 的回复:

CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以



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

全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。

我代码里面就这么写的。完全没有问题。。。

点击了求和按钮, 直接进了 OnSum() 函数。。
MFC 中如何给子线程发送消息

#15


new CCalculateThread这句话去掉呢?

#16


mark...

#17


引用 12 楼 wjjll123 的回复:
Quote: 引用 11 楼 wang603603 的回复:

Quote: 引用 10 楼 wjjll123 的回复:

CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以



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

全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。

我代码里面就这么写的。完全没有问题。。。


阁下能否把 源代码 发给我 272180850@qq.com  ,以便结贴。

#18


多谢各位的积极回答,问题已经自己解决了!
@1 提示‘内存不足’是 因为在 线程类中没有 添加 宏

 DECLARE_DYNCREATE(CCalculateThread)
 IMPLEMENT_DYNCREATE(CCalculateThread, CWinThread)

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

virtual BOOL InitInstance();
virtual int ExitInstance();

 且在BOOL InitInstance()中 不能简单的 return CWinThread::InitInstance(),
 必须  return true.

#1


BOOL PostThreadMessage( DWORD idThread,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
);

#2


idThread为目标线程的id

#3


 m_pCalculateThread.PostMessage(WM_QUIT,0,0);

#4


引用 1 楼 Qyee16 的回复:
BOOL PostThreadMessage( DWORD idThread,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
);

 照着做了, 但是 子线程 介绍不到消息,,,!发现断点进不去。。。

#5


接受消息的代码怎么写的?

#6


引用 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(); 函数中去调用是没有问题的,
  也就是说 子线程中 发送的消息是没有问题的, 只是在 主对话框中 消息没有发送成功,导致我的子线程消息响应函数没有被 触发。。。。

#7


Spy++软件会用吗?
《Windows核心编程》

#8


引用 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 会不会有影响。。?
  

#9


CCalculateThread* CCalculateThread= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
试试看呢

#10


CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以

#11


引用 10 楼 wjjll123 的回复:
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以



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

全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。

#12


引用 11 楼 wang603603 的回复:
Quote: 引用 10 楼 wjjll123 的回复:

CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以



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

全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。

我代码里面就这么写的。完全没有问题。。。

#13


子线程没有消息泵吧?
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)吧. 

#14


引用 12 楼 wjjll123 的回复:
Quote: 引用 11 楼 wang603603 的回复:

Quote: 引用 10 楼 wjjll123 的回复:

CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以



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

全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。

我代码里面就这么写的。完全没有问题。。。

点击了求和按钮, 直接进了 OnSum() 函数。。
MFC 中如何给子线程发送消息

#15


new CCalculateThread这句话去掉呢?

#16


mark...

#17


引用 12 楼 wjjll123 的回复:
Quote: 引用 11 楼 wang603603 的回复:

Quote: 引用 10 楼 wjjll123 的回复:

CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以



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

全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。

我代码里面就这么写的。完全没有问题。。。


阁下能否把 源代码 发给我 272180850@qq.com  ,以便结贴。

#18


多谢各位的积极回答,问题已经自己解决了!
@1 提示‘内存不足’是 因为在 线程类中没有 添加 宏

 DECLARE_DYNCREATE(CCalculateThread)
 IMPLEMENT_DYNCREATE(CCalculateThread, CWinThread)

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

virtual BOOL InitInstance();
virtual int ExitInstance();

 且在BOOL InitInstance()中 不能简单的 return CWinThread::InitInstance(),
 必须  return true.