¿Cuál es el patrón de uso correcto para una variable TBytes? Desde mi punto de vista, TBytes no es una clase, sino una "matriz dinámica de bytes". No estoy seguro de dónde se asigna la memoria, cuándo se libera y cuál es la mejor manera de pasarlo de un productor a un consumidor. Quiero que mi productor cree una instancia TBytes y luego la pase a un consumidor. Después de que esto suceda, el productor desea reutilizar su variable miembro de TBytes, con el conocimiento de que el consumidor eventualmente devolverá la memoria al sistema. Si TBytes fuera un objeto, no tendría ningún problema, pero no estoy seguro de cómo funcionan los TBytes en este escenario.Delphi XE TBytes uso correcto
Por ejemplo, en el objeto A, deseo ensamblar algunos datos en una matriz TBytes que es miembro del objeto A. Cuando eso esté completo, quiero pasar la matriz TBytes a otro objeto B, que luego se convierte en el dueño de los datos. Mientras tanto, de vuelta en el objeto A, quiero comenzar a reunir más datos, reutilizando la variable miembro de TBytes.
type
TClassA = class
private
FData: TBytes;
public
procedure AssembleInput(p: Pointer; n: Cardinal);
end;
TClassB = class
public
procedure ProcessData(d: TBytes);
end;
var
a: TClassA;
b: TClassB;
procedure TClassA.AssembleInput(p: Pointer; n: Cardinal);
begin
SetLength(FData, n);
Move(p^, FData, n); // Is this correct?
...
b.ProcessData(FData);
...
// Would it be legal to reuse FData now? Perhaps by copying new (different)
// data into it?
end;
procedure TClassB.ProcessData(d: TBytes);
begin
// B used the TBytes here. How does it free them?
SetLength(d, 0); // Does this free any dynamic memory behind the scenes?
end;
¡Gracias de antemano!
Gracias por las explicaciones. Sí, la razón por la cual FData es una variable miembro se debe a que el productor obtiene datos de un socket TCP, por lo que generalmente solo obtiene una parte de los datos cada vez que se llama. Sí, sí quiero al productor/consumidor, y el comentario sobre "necesidad de transferir la propiedad de los datos" es exactamente lo que trato de hacer. Y sí, el código desacoplado era bastante complicado; de ahí la simplificación. Finalmente, todavía no estoy seguro de cómo "transferir la propiedad" correctamente. ¿Puedes aclarar un poco ese problema? –
Deje que el consumidor tome una referencia y luego libere la referencia del productor. Consumer.data: = FData; FData: = nil; –