PostMessage邮件大小的限制?

时间:2010-01-18 17:42:54

标签: 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: ' + 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对数据的大小有限制,或者可能是其他什么?

这是Delphi 2010。

编辑:对不起,我忘了显示msg的类型。是String

2 个答案:

答案 0 :(得分:0)

我认为你不应该使用Move。你确定所有的角色都是相同的长度吗?

更新:

GetMem(p, (Length(Msg) + 1)*SizeOf(Char)); 
Move(Msg[1], p^, (Length(Msg)+ 1)*SizeOf(Char)); 

我从来没有过多地使用过pChar,但是在执行此操作之前,您不必在Msg字符串中添加#0字符。使用GetMem时,Delphi 2010不会将内存清零。

答案 1 :(得分:0)

我在这里采取的另一条路线不是mghie(他们完全回答魔法完全非魔法地消失在我身上:P),看着你的代码我只能推断你发送数据在同一个过程中。

您只是通过PostMessage传递指针,因此对邮件大小没有限制。当您调试代码时( 调试那段代码,对吧?),它在什么行上破坏了? .text的分配?

首先尝试将pchar分配给字符串,然后将该字符串写入文件。如果有效,你有一个方向可以调查。

如果这不起作用,请使用调试器验证指针确实指向字符串,并且该字符串是否为零终止。从您发布的代码中看起来就像是。