用postthreadmessage发送的线程消息为什么在线程里不一定收的到?

jinhx 2011-05-26 03:36:25
在主线程里 PostThreadMessage(myThread.Threadid,wmmsg,0,integer('测试内容'));

线程里循环 PeekMessage(myMsg,0,0,0,PM_REMOVE);

有时收不到,有时收到的是错误信息(string(myMsg.lParam) 不等于 '测试内容' ),这是为什么?
...全文
189 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
CaesarDM 2011-05-30
  • 打赏
  • 举报
回复
你的文本,在发送过消息后,就被释放了,哪来的内容。
zhuang_bx 2011-05-29
  • 打赏
  • 举报
回复
不用这么麻烦吧,在子线程中设置一个事件,下载完,通知主线程,主线程计数剩余数量,语音播报.
jinhx 2011-05-26
  • 打赏
  • 举报
回复
这么说吧,我做的优盘下载文件的程序,一边下载,一边语音报还剩多少张,如果单线程,下的时候不能报,报的时候不能下,我就想主线程下,取得剩余数字后发消息给子线程,子线程报,所以每次要连续发一串
jinhx 2011-05-26
  • 打赏
  • 举报
回复
主线程里
for i := 0 to 5 do begin
postthreadmessage(mythread.threadid,9995,0,integer(inttostr(i)));
end;
连续post 5次

子线程里
PeekMessage(myMsg,0,0,0,PM_NOREMOVE);
while GetMessage(myMsg,0,0,0) do begin
if myMsg.message = 9995 then begin
(在这里发现并不是每次都能收到,就算收到string(myMsg.lparam)后也不是 0、1、2、3、4、5,
可能是 1、d:\process*.j、3、 、)(我描述的都是string型)
...
end;
end;
Lactoferrin 2011-05-26
  • 打赏
  • 举报
回复
是不是PeekMessage(myMsg,0,0,0,PM_NOREMOVE);之前就发了
你把代码弄上来
jinhx 2011-05-26
  • 打赏
  • 举报
回复
1、我在线程创建的时候就执行过一次PeekMessage(myMsg,0,0,0,PM_NOREMOVE);

2、我检查过mymsg.message了
Lactoferrin 2011-05-26
  • 打赏
  • 举报
回复
那个线程第一次调用PeekMessage之类的api之前是没有消息队列的,此时发消息没用

你PeekMessage(myMsg,0,0,0,PM_REMOVE);要检查myMsg.message是否等于wmmsg

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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