线程间用自定义消息传送字符串的问题。(100分)

  • 主题发起人 主题发起人 Amuro
  • 开始时间 开始时间
A

Amuro

Unregistered / Unconfirmed
GUEST, unregistred user!
主线程要把计算结果发送给子线程。我把结果转换成字符串。用自定义消息发送给子线程。
程序示例如下:
const
MyMsg = WM_USER+1;
type
TmyThread = class(TThread)
private
protected
procedure Execute;
override;
end;

procedure TMainForm.Button1Click(Sender: TObject);
var
s:string;
p:pointer;
begin
s:=GetString();//转换计算结果为字符串
GetMem(P,Length(s)+4);//问题
StrPCopy(p,s);
PostThreadMessage(MyThread.ThreadID,MyMsg,
Length(s)+4,Longint(p));
end;

procedure TMyThread.Execute;
var
s:string;
M:TMsg;
P:Pointer;
begin
if PeekMessage(M ,0, 0, 0, PM_REMOVE) then
begin
if M.message = MyMsg then
begin
s:=PChar(M.lParam);
p:=ptr(M.lParam);
FreeMem(p,M.wParam);
end;
.........
end
end;
问题:如果去掉GetMem(P,Length(s)+4),那么运行十次会有1,2次接收到错误的字符串,
我这样处理后虽然能收到正确的字符串,但觉得不妥。分配的内存正确释放了?谁有更
好的方法?
 
up,
没有不妥
 
1:
procedure TMainForm.Button1Click(Sender: TObject);
var
s:pstring;
p:pointer;
begin
New(s);
s^:=GetString();//转换计算结果为字符串
...
end;

2:
TMyThread = Class(TThread)
public
procedure GetMyMessage(var Msg:TMessage);Message MyMsg;
end;

procedure GetMyMessage(var Msg:TMessage);
var
s:pString;
begin
s:=PString(Msg.WParam);
....//处理过程
Dispose(s);
end;
 
程序的写法有问题,消息并没有增加字符串的引用,
所以字符串早就释放了,最好的办法是建立一个队列,互斥访问,
给你个例子吧
http://61.132.118.185:8080/dispdocnew.php?id=3624
演示线程的同步与互斥,
同时,演示Windows同步对象
临界区的使用,还有动态数组,队列,栈对象的使用
以及线程的安全退出
 
to LiChaoHui;
要登陆才可以下载,发到我的信箱里好么?
mailto:yxmay@yahoo.com.cn
 
多人接受答案了。
 
后退
顶部