Mẫu sử dụng chính xác cho biến TBytes là gì? Từ sự hiểu biết của tôi, TBytes không phải là một lớp, mà là một "mảng động của các byte". Tôi không chắc chắn nơi bộ nhớ được phân bổ cho nó, khi nó được giải phóng, và đó là cách tốt nhất để chuyển nó từ một nhà sản xuất cho người tiêu dùng. Tôi muốn nhà sản xuất của tôi tạo ra một cá thể TBytes, sau đó chuyển nó cho người tiêu dùng. Sau khi điều này xảy ra, nhà sản xuất muốn sử dụng lại biến thành viên TBytes của nó, nội dung trong kiến thức rằng người tiêu dùng cuối cùng sẽ trả lại bộ nhớ cho hệ thống. Nếu TBytes là một đối tượng, tôi sẽ không gặp bất kỳ vấn đề gì, nhưng tôi không chắc chắn về cách các TBytes hoạt động trong kịch bản này. Ví dụ, trong đối tượng A, tôi muốn tập hợp một số dữ liệu vào một mảng TBytes là một thành viên của đối tượng A. Khi điều đó hoàn tất, sau đó tôi muốn chuyển mảng TBytes đến đối tượng B khác, mà sau đó trở thành chủ sở hữu dữ liệu. Trong khi đó, trở lại đối tượng A, tôi muốn bắt đầu lắp ráp thêm dữ liệu, sử dụng lại biến thành viên TBytes.Delphi XE TBytes sử dụng chính xác
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;
Cảm ơn bạn trước!
Cảm ơn bạn đã giải thích. Có, lý do FData là một biến thành viên là vì nhà sản xuất đang lấy dữ liệu từ một socket TCP, vì vậy nó thường chỉ nhận được một phần dữ liệu mỗi khi nó được gọi. Có, tôi muốn nhà sản xuất/người tiêu dùng và nhận xét về "cần phải chuyển quyền sở hữu dữ liệu" là _exactly_ những gì tôi đang cố gắng làm. Và vâng, mã được tách riêng khá phức tạp; do đó đơn giản hóa. Cuối cùng, tôi vẫn không chắc chắn làm thế nào để "chuyển quyền sở hữu" một cách chính xác - bạn có thể làm rõ vấn đề đó một chút? –
Để người tiêu dùng tham khảo và sau đó giải phóng tham chiếu của nhà sản xuất. Consumer.data: = FData; FData: = nil; –