0

データを含むさまざまなメッセージを送信するタスクがあります。

例えば:

task.Comm.Send(MSG_JOB_ERROR,[string, string,string,string,string, TObject]) ;

受信側で私が持っている

procedure TUDPBroadCast.OnWorkerJobError(var msg: TOmniMessage);
var 
    s : String ;
begin
    try
        s := 'TASK: ' + msg.MsgData.AsArrayItem[0].AsString + ', IP: ' +    
             msg.MsgData.AsArrayItem[1].AsString + ', PORT: ' + 
             msg.MsgData.AsArrayItem[2].AsString +
             ', DATA: ' + msg.MsgData.AsArrayItem[3].AsString + ', REPLY: '+  
             msg.MsgData.AsArrayItem[4].AsString  ;
        Xlog('JOB ERROR > ' + s, 'UDPBroadCast') ;
        processworkobject(msg.MsgData.AsArrayItem[4].AsObject) ; 
    finally
        msg.MsgData.Clear ;
    end;
end; 

しかし、MsgData.Clear がすべてのメモリの割り当てを正しく解除するとは思えません。

TomniValue の割り当て解除の正しい処理は何ですか?

4

2 に答える 2

1

TOmniMessage が保持するオブジェクトを解放する必要があります。少なくとも私の知る限りでは。単純な型は問題ありません。また、参照カウントにより、インターフェイスはそれ自体で明確になります。ただし、純粋なポインタと TObject の子孫については、free を呼び出す必要があります。彼らが使用するメモリに注意する必要があります。

TOmniMessage には、それらが使用する実際のメモリへの参照ポインタのみが含まれます。

したがって、次のようにする必要があります。

msg.MsgData.AsObject.Free;
msg.MsgData.Clear;

または純粋なポインタの場合

FreeMem(msg.MsgData.AsPointer)
msg.MsgData.Clear;

私も追加するのを忘れていました。彼らが指すメモリに責任がある場合にのみ、それを行ってください:)

于 2014-03-11T10:28:52.647 に答える
0

msg.MsgData は TOmniValue です。OmniThreadLibrary の最新バージョンでは、TOmniValue.OwnsObject:=True を設定することにより、TOmniValue はそのオブジェクトを所有でき、この機能を容易にする他のヘルパー メソッドがいくつかあります。OwnsObject が true の場合、TOmniValue が解放されるとオブジェクトが解放されるため、メモリ管理について心配する必要がなくなります。

于 2014-03-13T04:19:58.190 に答える