消息线程的遇到故障了

wzuxian2012 2012-04-30 08:11:31
 问题1:为什么代码 ,运行后,什么结果都没有?

问题2:main函数是发送了3个消息给线程。当线程被挂起的时候,

会受到消息吗?

问题3: 印象中,线程id是最没哟用的,一般都是通过句柄来操作内核对象。

os是通过什么 机制,根据线程id,可以PostThreadMessage.


#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <process.h>
using std::cout;

using std::endl;

#define THRD_MSG1 WM_USER+1
#define THRD_MSG2 WM_USER+2
#define THRD_MSG3 WM_USER+3

unsigned int WINAPI MyThread(void*)
{

MSG msg;

while(GetMessage(&msg,NULL,0,0) )
{

switch(msg.message)
{
case THRD_MSG1 :
cout<<"消息1"<<endl;
break;


case THRD_MSG2 :
cout<<"消息2"<<endl;
break;

case THRD_MSG3 :
cout<<"消息3"<<endl;
break;

default:
break;

}

}
return 0;
}


int main()
{

HANDLE hThrd;

unsigned id;


hThrd=(HANDLE)_beginthreadex(NULL,0, MyThread,NULL,0,&id);

PostThreadMessage(id,THRD_MSG1,0,0);


PostThreadMessage(id,THRD_MSG2,0,0);

PostThreadMessage(id,THRD_MSG3,0,0);

CloseHandle(hThrd);


return 0;


}
...全文
86 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lactoferrin 2012-04-30
  • 打赏
  • 举报
回复
不过就这个api来说还是调用了PsLookupThreadByThreadId
Lactoferrin 2012-04-30
  • 打赏
  • 举报
回复
win32k有自己的一套东西,和执行体分开的
Lactoferrin 2012-04-30
  • 打赏
  • 举报
回复
你已经说了没法输出的一个原因,就是进程过早结束
第二个原因是PostThreadMessage需要目标线程存在消息队列,但线程刚开始执行时没有消息队列,要等到调用了像GetMessage这样的api才行
wzuxian2012 2012-04-30
  • 打赏
  • 举报
回复
PostThreadmessage这个函数很奇怪, 有个参数是id, 一般对线程内核对象操作,是用其句柄,

对线程则是用id来操作。。。
wzuxian2012 2012-04-30
  • 打赏
  • 举报
回复
楼上 ,真是抱歉,又让你回帖,

刚学,什么都不懂,Sleep时间不够导致 主线程迅速 结束。 所以子线程也结束,所以什么多输出。


我用 PostThreadMessage(id,THRD_MSG2,0,0);

来替代你提供的循环, 结果却是无法输出。

疑问: SwitchToThread一般什么情况下使用呢? 很多网上代码,都不使用它

第二:这个循环,意思是如果发送失败,那么接着发送,只要第一个THRD_MSG1消息发送成功,

那么THRD_MSG2 也是会发送成功的,

觉得蛮奇怪的, 什么原因导致发送失败呢?

是:线程函数没有执行吗? 还是什么原因 ,会导致PostThreadMessage 失败。



Lactoferrin 2012-04-30
  • 打赏
  • 举报
回复
我试了可以,就是一个括号打错了
wzuxian2012 2012-04-30
  • 打赏
  • 举报
回复
你好不试试代码吧, 可能没有试, 没有感觉到问题故障所在啊

我试试了,都不行啊,急死我了,快十一点了
Lactoferrin 2012-04-30
  • 打赏
  • 举报
回复
PostThreadMessage(id,THRD_MSG1,0,0);
换成
do
{
if(PostThreadMessage(id,THRD_MSG1,0,0))break;
SwitchToThread();
]while(GetLastError()==ERROR_INVALID_THREAD_ID);
wzuxian2012 2012-04-30
  • 打赏
  • 举报
回复
楼上你好,

你能试试我的代码吗

什么结果都没有,急死我了
dahaiI0 2012-04-30
  • 打赏
  • 举报
回复
我记错了,第一个参数好像是线程ID。不好意思
dahaiI0 2012-04-30
  • 打赏
  • 举报
回复
PostThreadMessage第一个参数好像是句柄不是ID吧,你用错了
线程被挂起,是不会受到消息的,当恢复时会从消息队列里取出来,楼主可验证下

15,473

社区成员

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

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