能解决问题,1000分奉上(另开贴),帮忙提前也有分啊:),个线程用PostThreadMessage向另外一个线程发送消息,(另外一个线程用peekMessa

  • 主题发起人 主题发起人 美国提子
  • 开始时间 开始时间

美国提子

Unregistered / Unconfirmed
GUEST, unregistred user!
能解决问题,1000分奉上(另开贴),帮忙提前也有分啊:),个线程用PostThreadMessage向另外一个线程发送消息,(另外一个线程用peekMessage接收) (100分)<br />一开始好好的,PostThreadMessage发送后返回的是True,另外一个线程可以接收到,但程序运行10分钟左右后,PostThreadMessage返回的竟然是False
 
是另一个线程阻塞了吧!
 
哦,没有啊,还在运行阿,不过总共有3个线程
 
三个线程?跟最新的一种病毒很象,学习!
 
没人碰到过这种情况吗?
 
呵呵,楼主好久没来了,呵呵,接风先~
要么是阻塞了要么是冲突了。
 
呵呵,最近很忙啊,呵呵,说来惭愧,只有碰上问题的时候,才上趟大富翁
 
呵呵,这个问题偶答不了,偶帮你提吧:)
 
可能是线程的消息管道没有疏通。线程在接收消息前需要建立消息队列,通过PeekMessage函数。
前面好好的,后面才不行了。很可能是线程中没有处理完所有的消息。MsgWaitForMultipleObjects每一次收到消息后,应该用PeekMessage循环处理完所有的消息,否则队列如果满了,自己就无法PostMessage了。
呵呵,别人告诉偶的,你看看行不行:)
 
两个线程之间是通过信号量同步的
PostThreadMessage(XXXX.Handle,消息,0,0);//发送
PeekMessage(Msg,xxxx,0,0,PM_REMOVE);//接收
 
主窗口创建线程和事件句柄:
var
ASecurity_Attributes: SECURITY_ATTRIBUTES;
i: Integer;
begin
ASecurity_Attributes.nLength := SizeOf(SECURITY_ATTRIBUTES);
ASecurity_Attributes.lpSecurityDescriptor := nil;
ASecurity_Attributes.bInheritHandle := False;
HWaitEvent := CreateEvent(@ASecurity_Attributes, True, False, 'Client_Table');
//任务管理中心
HCommEvent := CreateEvent(@ASecurity_Attributes, True, False, 'Client_Table2');
//通信交换中心
ResetEvent(HWaitEvent);
ResetEvent(HCommEvent);
CommCenterThread := TCommCenterThread.Create(SysData,MSComm,'DB_HYMMS',HCommEvent,HWaitEvent);
CommCenterThread.Resume;//通信交换线程
TaskThread := TTaskThread.Create(DMW_Main.DB_Main.DatabaseName);
TaskThread.Resume;//任务管理线程
end;

任务管理单元发送消息给通信交换:
PostThreadMessage(CommCenterThread.ThreadID,SX_RTDETECTING,0,0);
//发送消息
ResetEvent(HWaitEvent);
//任务管理中心事件句柄设置为无信号状态
SetEvent(HCommEvent);
//信息交换中心时间句柄设置为发信号状态
case WaitForSingleObject(HWaitEvent,INFINITE) of //等待信息交换中心响应
。。。。。。。
信息交换单元接收任务管理发送的消息:
WaitForSingleObject(HCommEvent,INFINITE);
ResetEvent(HCommEvent);
Messagebl := PeekMessage(Mymsg,0,0,0,PM_REMOVE);//检测消息队列是否有消息
if Messagebl then
。。。。。。。

一开始好好的,PostThreadMessage发送后返回的是True,另外一个线程可以接收到,但程序运行10分钟左右后,PostThreadMessage返回的竟然是False
不知道应该如何解决
 
PostThreadMessage函数返回 False 后,马上调用
[red]GetLastError [/red]API,看看 Windows 的错误代码是什么,可能是
ERROR_INVALID_THREAD_ID
 
呵呵,我看看,今天plc被人拿走了,不知道能不能试出来
 
接收消息的线程正处于忙状态,不会立刻响应你的线程消息, 你的线程消息被放入
该线程的消息队列中,如果消息队列满, WINDOWS会自动丢弃你的线程消息
 
但是他一开始返回False,就一直返回False了阿,peekMessage 参数 设为PM_REMOVE不是说处理后马上移除消息了吗?
刚才试了一下,由于plc没有,通信交换中心返回的都是plc无响应,
两个线程消息通信好像又一直是正常的了
 
今天又试了一下
GetLastError 一开始返回6(句柄无效)
过一下返回8(存储空间不足,无法处理此命令)
 
1.句柄无效可能是因为你没有成功的创建线程,或线程已终止.
2.令人费解,难道你线程的消息队列长度到最大值了?
 
1、呵呵,线程时肯定创建好了,因为前面运行了10分多钟了阿
2、你意思是说,存储空间不足是指消息队列已满而不是物理空间不够?
3、关键是问题出在那里啊,该怎么改啊
 
帮你顶了
 
呵呵,多谢了,有人顶就有希望阿
 
后退
顶部