但是如何设置 ::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
);
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
#2
idThread为目标线程的id
#3
m_pCalculateThread.PostMessage(WM_QUIT,0,0);
#4
照着做了, 但是 子线程 介绍不到消息,,,!发现断点进不去。。。
#5
接受消息的代码怎么写的?
#6
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核心编程》
《Windows核心编程》
#8
在子线程中的消息响应函数和 在主对话框中的 自定义消息 怎么不一样啊(这个例子是我看资料上的)?
子线程的那个类是继承与 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定义全局的,然后直接调用函数。。。看看可以不可以
cct定义全局的,然后直接调用函数。。。看看可以不可以
#11
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。
#12
我代码里面就这么写的。完全没有问题。。。
#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)吧.
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
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。
我代码里面就这么写的。完全没有问题。。。
点击了求和按钮, 直接进了 OnSum() 函数。。
#15
new CCalculateThread这句话去掉呢?
#16
mark...
#17
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。
我代码里面就这么写的。完全没有问题。。。
阁下能否把 源代码 发给我 272180850@qq.com ,以便结贴。
#18
多谢各位的积极回答,问题已经自己解决了!
@1 提示‘内存不足’是 因为在 线程类中没有 添加 宏
@2 线程类无法收到 主对话发送的消息时应为, 在线程类中, 没有重写
且在BOOL InitInstance()中 不能简单的 return CWinThread::InitInstance(),
必须 return true.
@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
);
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
#2
idThread为目标线程的id
#3
m_pCalculateThread.PostMessage(WM_QUIT,0,0);
#4
BOOL PostThreadMessage( DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
照着做了, 但是 子线程 介绍不到消息,,,!发现断点进不去。。。
#5
接受消息的代码怎么写的?
#6
接受消息的代码怎么写的?
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核心编程》
《Windows核心编程》
#8
接受消息的代码怎么写的?
在子线程中的消息响应函数和 在主对话框中的 自定义消息 怎么不一样啊(这个例子是我看资料上的)?
子线程的那个类是继承与 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定义全局的,然后直接调用函数。。。看看可以不可以
cct定义全局的,然后直接调用函数。。。看看可以不可以
#11
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。
#12
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)吧.
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
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。
我代码里面就这么写的。完全没有问题。。。
点击了求和按钮, 直接进了 OnSum() 函数。。
#15
new CCalculateThread这句话去掉呢?
#16
mark...
#17
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
cct定义全局的,然后直接调用函数。。。看看可以不可以
CCalculateThread* cct= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
全局的也不行, 第一步就通不过,提示 “内存不足”! 网上也有不少人提这个 问题。。
我代码里面就这么写的。完全没有问题。。。
阁下能否把 源代码 发给我 272180850@qq.com ,以便结贴。
#18
多谢各位的积极回答,问题已经自己解决了!
@1 提示‘内存不足’是 因为在 线程类中没有 添加 宏
@2 线程类无法收到 主对话发送的消息时应为, 在线程类中, 没有重写
且在BOOL InitInstance()中 不能简单的 return CWinThread::InitInstance(),
必须 return true.
@1 提示‘内存不足’是 因为在 线程类中没有 添加 宏
DECLARE_DYNCREATE(CCalculateThread)
IMPLEMENT_DYNCREATE(CCalculateThread, CWinThread)
@2 线程类无法收到 主对话发送的消息时应为, 在线程类中, 没有重写
virtual BOOL InitInstance();
virtual int ExitInstance();
且在BOOL InitInstance()中 不能简单的 return CWinThread::InitInstance(),
必须 return true.