如何用PostMessage、SendMessage传送 字符串 或者 结构体??例如:
TMyRecord=record
s:string;
end;var s:string;
MyR:TMyRecord;基本是这样发送:
PostMessage(窗口handle , 某消息 , 0 , integer(s));
PostMessage(窗口handle , 某消息 , 0 , integer(MyR));但是看到有 字符串 接收不全 的情况。我要问如下几种情况:
1、发消息 和 接消息 在 同一 线程中procedure TForm1.My(var msg:TMessage);//message WM_My;
var pc:PChar;
My:TMyRecord;
s:string;
begin
if msg.LParam=5 then
begin
My:=TMyRecord(msg.WParam);
Memo1.Lines.Add('My.s : '+My.s);
end;
if msg.LParam=6 then
begin
s:=string(msg.WParam);
Memo1.Lines.Add('s : '+s);
end;
end;procedure TForm1.Button11Click(Sender: TObject);
var tt:TMyRecord;
begin
tt.s:='s2343243';
PostMessage(handle,WM_My,integer(tt),5);
end;procedure TForm1.Button12Click(Sender: TObject);
var s:string;
begin
s:='jkchjvb';
PostMessage(handle,WM_My,integer(s),6);
end;
2、发消息 和 接消息 在 同一进程的 不同线程 中
主线程 接收消息:procedure TForm1.My(var msg:TMessage);//message WM_My;
var pc:PChar;
My:TMyRecord;
s:string;
begin
if msg.LParam=5 then
begin
My:=TMyRecord(msg.WParam);
Memo1.Lines.Add('My.s : '+My.s);
end;
if msg.LParam=6 then
begin
s:=string(msg.WParam);
Memo1.Lines.Add('s : '+s);
end;
end;子线程 发送消息:procedure TAAThread.Execute;
var tt:TMyRecord;
begin
tt.s:='s2343243';
PostMessage(handle,WM_My,integer(tt),5);
end;//或者 子线程 发 字符串
procedure TAAThread.Execute;
var s:string;
begin
s:='jkchjvb';
PostMessage(handle,WM_My,integer(s),6);
end;
以上两种情况,会不会 在字符串比较长 或 结构体比较大 时,接收的信息不全??如果会产生 接收不全 的情况,那如何避免其发生? ------①
请注意:我上面代码中用到的 tt , s 都是局部变量,没有用全局变量。把postmessage换成sendmessage情况又如何呢? ------②
sendmessage能保证 “2、发消息 和 接消息 在 同一进程的 不同线程 中” 的 局部变量值 被完全接收吗? ------③
子线程 用sendmessage发消息时(如2、中的代码,PostMessage改成SendMessage),如果消息处理过程比较耗时,在消息处理完成前,子线程 处于上面状态?阻塞?挂起?消耗CPU时间片吗?消耗系统资源吗? ------④对①②③④处的几个问题,进行解答,谢谢。
TMyRecord=record
s:string;
end;var s:string;
MyR:TMyRecord;基本是这样发送:
PostMessage(窗口handle , 某消息 , 0 , integer(s));
PostMessage(窗口handle , 某消息 , 0 , integer(MyR));但是看到有 字符串 接收不全 的情况。我要问如下几种情况:
1、发消息 和 接消息 在 同一 线程中procedure TForm1.My(var msg:TMessage);//message WM_My;
var pc:PChar;
My:TMyRecord;
s:string;
begin
if msg.LParam=5 then
begin
My:=TMyRecord(msg.WParam);
Memo1.Lines.Add('My.s : '+My.s);
end;
if msg.LParam=6 then
begin
s:=string(msg.WParam);
Memo1.Lines.Add('s : '+s);
end;
end;procedure TForm1.Button11Click(Sender: TObject);
var tt:TMyRecord;
begin
tt.s:='s2343243';
PostMessage(handle,WM_My,integer(tt),5);
end;procedure TForm1.Button12Click(Sender: TObject);
var s:string;
begin
s:='jkchjvb';
PostMessage(handle,WM_My,integer(s),6);
end;
2、发消息 和 接消息 在 同一进程的 不同线程 中
主线程 接收消息:procedure TForm1.My(var msg:TMessage);//message WM_My;
var pc:PChar;
My:TMyRecord;
s:string;
begin
if msg.LParam=5 then
begin
My:=TMyRecord(msg.WParam);
Memo1.Lines.Add('My.s : '+My.s);
end;
if msg.LParam=6 then
begin
s:=string(msg.WParam);
Memo1.Lines.Add('s : '+s);
end;
end;子线程 发送消息:procedure TAAThread.Execute;
var tt:TMyRecord;
begin
tt.s:='s2343243';
PostMessage(handle,WM_My,integer(tt),5);
end;//或者 子线程 发 字符串
procedure TAAThread.Execute;
var s:string;
begin
s:='jkchjvb';
PostMessage(handle,WM_My,integer(s),6);
end;
以上两种情况,会不会 在字符串比较长 或 结构体比较大 时,接收的信息不全??如果会产生 接收不全 的情况,那如何避免其发生? ------①
请注意:我上面代码中用到的 tt , s 都是局部变量,没有用全局变量。把postmessage换成sendmessage情况又如何呢? ------②
sendmessage能保证 “2、发消息 和 接消息 在 同一进程的 不同线程 中” 的 局部变量值 被完全接收吗? ------③
子线程 用sendmessage发消息时(如2、中的代码,PostMessage改成SendMessage),如果消息处理过程比较耗时,在消息处理完成前,子线程 处于上面状态?阻塞?挂起?消耗CPU时间片吗?消耗系统资源吗? ------④对①②③④处的几个问题,进行解答,谢谢。
解决方案 »
- delphi bypass 是什么意思
- “我是鋤禾,你是當午”我今天才知道這句話是什麼意思 ,我暈
- 请教,退出编辑状态后,如何自动进入
- 多次调用的函数内的局部变量是否会重复消耗资源?
- 一个应用程序分不同功能模块每个模块给不同人开发,他们是否都是Exe文件形式(各人思路均不透明)怎么设计还有。。。
- 急求,函数用法
- 新手,关于MYSQL数据库连接问题
- 导出了Excel后的问题!!!!!!!!
- idftp.put不返回
- 多进程访问一个数据表的问题 (特急)
- 用ODAC的OraQuery不能修改记录,提示Cannot modify a read-only dataset
- 【求助】求ZlibEx.pas等3个标准文件
------④ 子线程挂起
var tt:TMyRecord;
begin
tt.s:='s2343243';
PostMessage(handle,WM_My,integer(tt),5);
end;这样当然不全,因为参数只能是一个integer,你这样发只能发4个字节,所以你要改成发指针,比如:
var tt:TMyRecord;
begin
tt.s:='s2343243';
PostMessage(handle,WM_My,integer(@tt),5);
end;接收的时候当然也不用能你原来的方法:My:=TMyRecord(msg.WParam);这样取回来了,也要把TMyRecord声明成指针:
type
PMyRecord=^TMyRecord;
var
My:PMyRecord;
my:=PMyRecord(msg.WParam);这样数据就全了。不过还有个问题,因为你的这个var tt:TMyRecord;是放过程里的,事实上过程一持行完tt就会被释放了。所以你要自己分配内存,new一个指针,等那边接收完再dispose,这样就没问题了
使用wm_copydata 发送,