Я посылаю сообщение журнала в основной форме с помощью этого:Предел размера сообщения PostMessage?
Для отправки сообщения:
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.
EDIT: К сожалению, я забыл показать тип сообщ. Является String
.
PostMessage может отправлять целые числа, поэтому это окончательно не то. – nos
Nos, вы должны опубликовать это как ответ, потому что это правильный ответ. Он не решает проблему Mamcx, но он не просил разрешения; он просто спросил, может ли быть причиной сообщения. –
Отсутствует одна часть информации - каков тип переменной * Msg *, данные которой вы перемещаете? Объявление этой переменной может повлиять на то, почему код приемника сообщений не ведет себя так, как ожидалось. Кроме того, что «слишком велико»? Какая длина данных Msg работает, а какая длина нет? Является ли это последовательным, т. Е. Действительно ли сообщения длины N-1 всегда работают, а длина N всегда зависает (где N еще не указано)? Наконец [sic], что вызов FreeMem (p) в обработчике сообщения должен быть дублирован в вашем обработчике исключений или желательно быть в попытке. Наконец, чтобы гарантировать, что p освобожден. – Deltics