Delphi 邮件大小的限制?
我正在使用以下命令向主窗体发送日志消息: 要发送此消息,请执行以下操作:Delphi 邮件大小的限制?,delphi,multithreading,Delphi,Multithreading,我正在使用以下命令向主窗体发送日志消息: 要发送此消息,请执行以下操作: procedure LogMsg(Msg: string; Kind:TMsgType=msgNormal); var p: pChar; begin case Kind of msgError: Msg := '[Error] ' + Msg; msgInformation: Msg := '# ' + Msg; msgExternal: Msg := 'Plugin: ' + M
procedure LogMsg(Msg: string; Kind:TMsgType=msgNormal);
var
p: pChar;
begin
case Kind of
msgError: Msg := '[Error] ' + Msg;
msgInformation: Msg := '# ' + Msg;
msgExternal: Msg := 'Plugin: ' + Msg;
end;//if
GetMem(p, (Length(Msg) + 1)*SizeOf(Char));
Move(Msg[1], p^, (Length(Msg)+ 1)*SizeOf(Char));
PostMessage(Application.MainForm.Handle, WM_LOG_MESSAGE, 0, integer(p));
end;
并显示:
procedure TfrmMain.WMLog(var Message: TMessage);
var
p: pChar;
Lista:TStringList;
begin
try
p := pChar(Message.LParam);
if EditLog.Lines.Count>100 then
begin
EditLog.Lines.Clear;
end;//if
Lista := TStringList.Create;
try
Lista.Delimiter := #10;
Lista.text := p;
EditLog.Lines.AddStrings(Lista);
finally
Lista.Free;
end;//try
{$ifndef FPC}
EditLog.GotoLineAndCenter( EditLog.Lines.Count );
{$endif}
Freemem(p);
except
on E: Exception do
EditLog.Lines.Add(E.Classname + ': ' + E.Message);
end;//try
end;
这用于记录执行某些python脚本的输出
但是,如果消息字符串太大,进程将挂起,因此有必要终止python进程
我不知道可能存在一个限制。PostMessage对数据的大小有限制,或者可能是其他内容
这是德尔福2010
编辑:对不起,我忘了显示msg的类型。是字符串。我想你不应该使用Move。您确定所有字符的长度都相同吗 更新:
GetMem(p, (Length(Msg) + 1)*SizeOf(Char));
Move(Msg[1], p^, (Length(Msg)+ 1)*SizeOf(Char));
我从来没有使用过太多的pChar,但是在执行此操作之前,您不需要在Msg字符串中附加一个0字符吗。Delphi 2010在使用GetMem时不会将内存归零。我选择的是另一条路线,而不是mghie,他的答案在我身上神奇地完全消失了:p,看看你的代码,我只能推断你是在同一个过程中发送数据的 您只是在PostMessage中传递一个指针,因此消息大小没有限制。当你调试你的代码时,你正在调试那段代码,对吗?它在哪一行中断?文本的赋值 首先尝试将pchar分配给字符串,然后将该字符串写入文件。如果这样做有效,你就有了一个方向
如果不起作用,请使用调试器验证指针是否确实指向字符串,以及该字符串是否以零结尾。从您发布的代码来看,似乎是这样。PostMessage只能发送整数,因此肯定不是这样。不,您应该将其作为答案发布,因为它是正确的答案。这不能解决Mamcx的问题,但他没有要求解决;他只是问消息长度是否是原因。有一条信息缺失——您正在移动其数据的Msg变量的类型是什么?该变量的声明可能与消息接收器代码的行为不符合预期的原因有关。还有,什么东西太大了?Msg数据的长度是多少?这是否一致,即长度为N-1的消息是否始终有效,长度为N的消息是否始终挂起在尚未指定N的位置?最后[sic]消息处理程序中对FreeMemp的调用应该在异常处理程序中重复,或者最好是在尝试中。最后,确保释放p。虽然有更好的方法来复制字符串,但使用Move的代码没有问题。字符的长度显然是相同的,因为它们都在同一个程序中,而且他复制的字符数量与他分配的内存数量完全相同。更好的方法是:var p:PString;Newp;p^:=味精;然后,在消息处理程序中:var p:PString;p:=PStringMsg.LParam;EditLog.Addp^;处置;所以,这就是答案,不是对它的限制。而且你的代码更干净!。请写一个答案,这样我就可以做标记了。python的问题与@Paul Jan有关:在这个消失的行为中没有魔法——在重新阅读这个问题时,我得出结论,这个PostMessage确实只能在同一个应用程序中,所以我删除了答案。是的,在同一个应用程序中。我需要这样做,因为代码位于多线程服务器上,使用将日志输出发送到主线程的RemObjects。