Delphi关于线程的消息处理(300分)

  • 主题发起人 主题发起人 remag
  • 开始时间 开始时间
R

remag

Unregistered / Unconfirmed
GUEST, unregistred user!
在平时写程序时,总是碰到窗体(TForm)与线程(TThread)以及线程(TThread)与线程(TThread)消息通信问题。令人烦恼的是窗体或者(线程)不能向另外的线程(TThread)发送消息(线程没有窗口句柄)。请问线程之间如何传递消息。
 
线程可以发消息阿,用PostThreadMessage发送,当然接收线程必须要有消息循环
 
问题: 多线程如何进行消息的传递 ( 积分: 10 )
分类: 多线程

来自: yb_1014, 时间: 2004-04-13 22:42:00, ID: 2557235
我使用了多个线程,希望在多个线程之间实现消息的传递,不知道该如何处理,请各位高手指教。

来自: TYZhang, 时间: 2004-04-13 22:59:26, ID: 2557251
PostThreadMessage(TreadID,WM_USER,0,0);

来自: yb_1014, 时间: 2004-04-14 13:00:52, ID: 2558387
如何获得每个线程的id呀,如果要将一个线程的变量值传递到另一个线程该如何处理,谢谢

来自: 寻路, 时间: 2004-04-14 13:12:08, ID: 2558417
在线程里面通讯应该用PostThreadMessage来代替PostMessage
我写了一个例子供参考
一个form 两个线程类TReceiveThread和TSendThread
在form中定义
var
ReceiveHandle,ReceiveHandle:Thandle;
AReceiveThread:TReceiveThread;
ASendThread:TSendThread;
const
WM_MYMESSAGE=WM_USER+101;

AReceiveThread:=TReceiveThread.Create(false);
Receivehandle:=AReceiveThread.ThreadID;

ASendThread:=TSendThread.Create(false);
Sendhandle:=ASendThread.ThreadID;

在TSendThread的Execute中写入
PostThreadMessage(Receivehandle,WM_MYMESSAGE,0,0);
在TReceiveTHread的published定义
procedure ReceiveMessage(var Msg:TMessage);Message WM_MYMESSAGE;

procedure TReceiveThread.ReceiveMessage(var Msg:TMessage);
var
i:integer;
begin

MessageBox(self.Handle,PChar('收到消息'),PChar('收到消息'),mb_Ok);
end;


在Execute中写入
var
Msg:TMsg;
DMsg: TMessage;
begin

{ Place thread code here}
// while truedo

while not Terminateddo
begin

Sleep(10);
// 释放CPU资源
if PeekMessage(Msg,0,0,0,PM_REMOVE) then
begin

DMsg.Msg:=Msg.message;
DMsg.wParam:=Msg.wParam;
DMsg.lParam:=Msg.lParam;
DMsg.Result:=0;
Dispatch(DMsg);
end;

end;


来自: 寻路, 时间: 2004-06-22 13:48:13, ID: 2676255
给分!

来自: delp, 时间: 2004-06-22 14:18:24, ID: 2676308
同意楼上,应该给分.

来自: xuebao_zx, 时间: 2004-12-07 16:24:57, ID: 2921679
顶一下

问题讨论没有结束 ...
 
msdn里专门有对线程中建立线程自己的消息循环的方法和处理方法有描述。
在消息循环部分,好像
 
线程间的通信可以不用消息啊,用别的办法吧!
 
线程间的消息可以用postthreadmessage()来发送,我指的是线程之间如何传送数据?比如线程A采集到的数据1,2,3,4,如何通过发消息传送给线程B的数组里?谢谢大家的帮忙,最好能给我一个实例。谢谢
 
SetLength(LpSend,RxCount);
move(TempBuff^,(@LpSend[0])^,RxCount);
PostThreadMessage( ThreadID, PWM_COMMDATA,
WPARAM(RxCount),LPARAM(@LpSend[0]));
接收线程同样用Move函数去读.
 
PWM_COMMDATA是自己定义的消息
 
可以把采集到的数据放到一个对象里,然后发送一个消息,在这个消息里通知其他线程去读取这个对象中的数据即可。
 
知道线程的id当然可以用消息的方式传递过去了,但是如果不知道线程的id那就有点难度了哦
 
to formality:
请问接收线程用什么函数?怎么写?我是第一次用多线程处理数据,请多多帮忙。谢谢。
同时也谢谢大家的支持
 
前面三楼已经给出来了:
procedure ReceiveMessage(var Msg:TMessage);Message WM_MYMESSAGE;
声明这样一个消息函数就行了。
后面的Message对应PostThreadMessage中的消息即可,这样,一发送消息,这个接收函数就会自动触发。
如:PostThreadMessage(ThreadID,WM_MYMESSAGE,0,0);//对应前面定义的那个
 
var
msg: TMsg;
//...
begin
while Truedo
begin
if not PeekMessage( msg, 0, 0, 0, PWM_COMMDATA ) then
begin
//do something
end;
if msg.hwnd <> 0{NULL} then
begin
TranslateMessage(msg);
DispatchMessage(msg);
Continue
end;
case msg.message of
PWM_COMMDATA: // New Data received
begin

//...
//do something break;
end;
我没有验证,但大体是这样的.你可以搜索一下PostThreadMessage,可能会有更详细的答案.祝你好运!
 
不好意思,上面有我写的一段代码,核心部分,其实是可以修改的:
在Execute中写入
var
Msg:TMsg;
DMsg: TMessage;
begin

{ Place thread code here}
// while truedo

while not Terminateddo
begin

Sleep(10);
// 释放CPU资源
if PeekMessage(Msg,0,0,0,PM_REMOVE) then
begin

DMsg.Msg:=Msg.message;
DMsg.wParam:=Msg.wParam;
DMsg.lParam:=Msg.lParam;
DMsg.Result:=0;
Dispatch(DMsg);
end;

end;

可以修改为(1):
var
Msg:TMsg;
DMsg: TMessage;
begin

{ Place thread code here}
// while truedo

while not Terminateddo

begin

if PeekMessage(Msg,0,0,0,PM_REMOVE) then

begin

if Msg = WM_QUIT then
break;
DMsg.Msg:=Msg.message;
DMsg.wParam:=Msg.wParam;
DMsg.lParam:=Msg.lParam;
DMsg.Result:=0;
Dispatch(DMsg);
end else
WaitMessage;
end;

这里的WaitMessage,在游戏中会经常替换成自己要处理的过程,比如,金山的WPS中的排版就是在这里完成的。
或者使用(2):
var
Msg: TMsg;
Message: TMessage;
begin
inherited;
while not Terminateddo
begin
if GetMessage(Msg, 0, 0, 0) then
begin
TranslateMessage(msg);
DispatchMessage(msg);
end else
Break;
end;
这种方式可以响应UI消息,但建议不要在新的线程中操作UI。
 
to formality:
我用了你的代码总是出错,能不能给我一个完整的源码?我才开始学用DELPHI,谢谢
to 寻路
如果 我要传递的数据有10个左右,应该怎么作?
谢谢大家对我的支持。分我愿意多加。
 
共享内存
 
是不是一次消息就传送10个数啊?然后接受的线程要把这10个数解析出来?对吧?如果是这样的话,你可以先把10个数组成一个字符串,然后发送过去之后,再解析出来撒,这不就解决问题了啊!
 
10个,你就用PostThreadMessage发10次!
 
发10次有点夸张了,发个数组指针过去是比较好的。
 
后退
顶部