请问工作者线程中,可以创建消息队列吗在Win32中?

zhaoyao73 2002-09-26 06:07:45
void WorkA(void*)
{
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE) ;
for(;;)
{
nRet = GetMessage(&msg,NULL,0,0);
if ( nRet == -1 )
{

}
else if ( nRet == 0 ) /* WM_QUIT */
{
break;
}
}
}
msdn说可以用此强迫建个消息队列,似乎不好使!
这是一个普通线程,可以用消息队列吗?
为什么用PostThreadMessage(hWorka,WM_QUIT,0,0);不好使?
...全文
290 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
WM_SUN 2002-10-15
  • 打赏
  • 举报
回复
Win32 中,用户界面线程有消息队列,而工作者线程没有消息队列。我们可以为工作者线程关联一个 THREADINFO 结构(未公开的结构)。一旦一个线程关联了一个 THREADINFO 结构,系统就为他创建一个消息队列(同时也就意味着此线程已经是一个用户界面线程了).

可以通过函数 GetWindowThreadProcessId(HWND, LPDWORD);
来获得创建窗口的线程.
zhaoyao73 2002-10-15
  • 打赏
  • 举报
回复
谢谢大家!看来只有_beginthreadex可以得到thread id.
另外,需要强调的是在工作者线程中确实是可以创建消息队列的,已经证实。

我的代码中PostThreadMessage(hWorka,WM_QUIT,0,0);确实用错,应该用thread id.
另外,只可接受自定义消息。
zhaoyao73 2002-09-26
  • 打赏
  • 举报
回复
看帮助是这样,如果用_beginthread难道不能吗?
goldntman 2002-09-26
  • 打赏
  • 举报
回复
试试_beginthreadex,最后一个参数可以接受,我没试过,不敢确定
zhaoyao73 2002-09-26
  • 打赏
  • 举报
回复
如何通过handle 得到 id呢?
hWorkA = _beginthread(WorkA,0,NULL);
hWorkA是handle.
zhaoyao73 2002-09-26
  • 打赏
  • 举报
回复
我的线程不能有窗口,要移植到linux下.
leesungyong 2002-09-26
  • 打赏
  • 举报
回复
MSDN上说只要你不停的PostThreadMessage, 系统会自动给你的线程创建消息队列, 但是没试成功过.
所以只好在自己的工作线程中创建窗口并隐藏它.
因为创建了窗口就会有消息队列.


zhaoyao73 2002-09-26
  • 打赏
  • 举报
回复
how to get id by handle?
oldworm 2002-09-26
  • 打赏
  • 举报
回复
可以处理消息,如果线程定义了接受消息,系统将强制为该worker线程建立消息队列,否则,不建立消息队列。

为什么用PostThreadMessage(hWorka,WM_QUIT,0,0);不好使?

BOOL PostThreadMessage(
DWORD idThread, // thread identifier
UINT Msg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
请注意PostThreadMessage第一个参数是线程ID,不是线程句柄。

zhaoyao73 2002-09-26
  • 打赏
  • 举报
回复
为什么不可以收到WM_QUIT呢?你可以把它当做自定义消息吗!
PostThreadMessage(hWorka,WM_QUIT,0,0);而且hWorkA也是句柄。
我并不想接收系统消息,只想用消息队列。

yamei2000 2002-09-26
  • 打赏
  • 举报
回复
工作线程是可以强制性接收系统消息的,但是最好还是不要接收系统消息(当然也包括自定义消息),因为这样可能使你的程序不那么稳定。
netsbull 2002-09-26
  • 打赏
  • 举报
回复
可以是可以得,不过,如果是一个非窗口的现成,你给他发送wm_quit可以收到吗?
还有你的这句 PostThreadMessage(hWorka
第一个参数不是句柄而是id,
你可以自定义一个线程处理行函数来完成你的目的,和自定义窗口消息处理差不多,ON_THREAD_MESSAGE

15,471

社区成员

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

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