PostThreadMessage为threshold是什么意思总是返回1444错误

CWinThread线程挂起后,怎样销毁线程?这时PostThreadMessage好像没反应了。该怎么解决_百度知道
CWinThread线程挂起后,怎样销毁线程?这时PostThreadMessage好像没反应了。该怎么解决
提问者采纳
再用PostThreadMessage:或者是UI线程。
先恢复线程;或者劳工线程自写消息循环而且你要确定线程有消息循环
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁使用PostThreadMessage在Win32线程间传递消息 - 逆风的香1314 - ITeye技术网站
PostThreadMessage的原型是这样的
BOOL PostThreadMessage( DWORD idThread,
WPARAM wParam,
LPARAM lParam);PostThreadMessage可以用于线程之间的异步通讯,因为它不用等待调用者返回,这也许是线程通讯中最简单的一种方法了。但是要注意以下问题1 .PostThreadMessage有时会失败,报1444错误(Invalid thread identifier. )其实这不一定是线程不存在的原因,也有可能是线程不存在消息队列(message queue)造成的。事实上,并不是每个thread都有message queue,那如何让thread具有呢?答案是,至少调用message相关的function一次,比如GetMessage,PeekMessage。2.如果是post动态分配的memory给另外一个thread,要注意内存的正确释放。3.PostThreadMessage不能够post WM_COPYDATE之类的同步消息,否则会报错4.最好不要使用PostThreadMessage post message给一个窗口,使用PostMessage替代。下面是我写的一个比较严整的例子,仅供参考。
#include &windows.h&#include &cstdio&#include &process.h&#define MY_MSG WM_USER+100const int MAX_INFO_SIZE = 20;HANDLE hStartE // thread start event// thread functionunsigned __stdcall fun(void *param){
printf("thread fun start\n");
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
if(!SetEvent(hStartEvent)) //set thread start event
printf("set start event failed,errno:%d\n",::GetLastError());
while(true)
if(GetMessage(&msg,0,0,0)) //get msg from message queue
switch(msg.message)
case MY_MSG:
char * pInfo = (char *)msg.wP
printf("recv %s\n",pInfo);
delete[] pI
return 0;}int main(){
unsigned nThreadID;
hStartEvent = ::CreateEvent(0,FALSE,FALSE,0); //create thread start event
if(hStartEvent == 0)
printf("create start event failed,errno:%d\n",::GetLastError());
//start thread
hThread = (HANDLE)_beginthreadex( NULL, 0, &fun, NULL, 0, &nThreadID );
if(hThread == 0)
printf("start thread failed,errno:%d\n",::GetLastError());
CloseHandle(hStartEvent);
//wait thread start event to avoid PostThreadMessage return errno:1444
::WaitForSingleObject(hStartEvent,INFINITE);
CloseHandle(hStartEvent);
int count = 0;
while(true)
char* pInfo = new char[MAX_INFO_SIZE]; //create dynamic msg
sprintf(pInfo,"msg_%d",++count);
if(!PostThreadMessage(nThreadID,MY_MSG,(WPARAM)pInfo,0))//post thread msg
printf("post message failed,errno:%d\n",::GetLastError());
delete[] pI
::Sleep(1000);
CloseHandle(hThread);
return 0;}
===========Happy New Year==============
逆风的香1314
浏览: 459846 次
来自: 北京
引用[img][url][/url][/img]
这个确实可以,感谢楼主
为什么你的代码每次都要先设置一个产品,然后才能取出一个产品,而 ...
好,以前有印象的,现在忘了问题如题。由于公司代码不能拿出来&,代码也不能贴出来,请原谅!这种情况下返回6是有什么可能的原因啊?
回复讨论(解决方案)
ErrLook&6&句柄无效,意思是因为HWND窗口句柄不存在。
但你用的是PostThreadMessage,用到的是thread&identifier,不是句柄。
MSDN:&returns&ERROR_INVALID_THREAD_ID&if&idThread&is&not&a&valid&thread&identifier,&or&if&the&thread&specified&by&idThread&does&not&have&a&message&queue.
#define&ERROR_INVALID_THREAD_ID&&&&&&&&&&1444L
所以不知道LZ的ErrLook&6到底怎么来的。
我用的是多个线程处理,一个消息分发线程,他负责创建其它的多个消息处理线程。然后将收到的消息根据消息处理线和的忙闲状态和处理消息的分类发给他们处理。这种情况在debug环境下没有问题,但是在Release环境中高概率出现(非必现)。所以我觉得应该可能是以分发线程启动以后,算是线程还没有启动完成的情况下,消息分发线程就把消息发送给了处理线程导致的。如果我在消息发送的地方Sleep(100),这样就没有问题了。但是我不明白,如果线程没有准备好,消息队列没有建立的情况下,应该是报的1444,怎么会报6?
处理线程初始化加入代码,可以尽快创建线程的消息队列:
//&1.&创建消息队列
PeekMessage(&msg,&NULL,&WM_USER,&WM_USER,&PM_NOREMOVE);
参考MSDN&PostThreadMessage&Remarks部分,小心处理好发送/接收之间的同步协作。
创建线程时候,传递一个参数,其中放置一个事件,表示线程已经运行。
线程退出前通知主线程,停止发送消息消息处理完成退出。
创建的代码检测这个事件然后退出,这是可以开始&PostMessage
很久没来看了,谢谢各位的精彩回答 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
PostThreadMessage的应用
下载积分:30
内容提示:
文档格式:PDF|
浏览次数:1|
上传日期: 19:21:15|
文档星级:
该用户还上传了这些文档
下载文档:PostThreadMessage的应用.PDF
官方公共微信他又不是一直都返回这样的错误,有时候有,有什候又没有。我查了一下,1444是指错误的线程ID,但我再检查线程ID号是正常的啊,郁闷!
另外,在Form的Create中创建线程关Resume后,马上向该线程发送消息,一定会返回这个错误,有人知道原因吗?
回复讨论(解决方案)
线程里面需要建立消息循环,不知道你建了没有,
&&m_TMsg:TM&&&&&&&&&&&&//消息句柄
&&PeekMessage(m_TMsg,0,WM_USER,WM_USER,PM_NOREMOVE);
&&//类似这样的MsgWaitForMultipleObjects等待函数
&&while&PeekMessage(m_TMsg,0,0,0,PM_REMOVE)&do
&&&&if&m_TMsg.hwnd&=&0&then
&&&&&&case&m_TMsg.message&of
&&&&&&&&....
&&&&end&else
&&&&&&DispatchMessage(m_TMsg);
类似这样的
有啊,我的消息循环代码是这样:
&&&PeekMessage(Msg,&0,&WM_USER,&WM_USER,&PM_NOREMOVE);
&&&while&not&Terminated&do&begin
&&&if&PeekMessage(Msg,0,0,0,PM_REMOVE)then
&&&&&case&Msg.Message&of
&&&&&&&.....}

我要回帖

更多关于 cvthreshold函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信