टीबीइट्स चर के लिए सही उपयोग पैटर्न क्या है? मेरी समझ से, टीबीइट्स एक वर्ग नहीं है, बल्कि "बाइट्स की गतिशील सरणी" है। मुझे यकीन नहीं है कि इसके लिए स्मृति आवंटित की जाती है, जब इसे मुक्त किया जाता है, और निर्माता से उपभोक्ता तक इसे पास करने का सबसे अच्छा तरीका कौन सा होता है। मैं चाहता हूं कि मेरा निर्माता टीबीइट्स उदाहरण बनाये, फिर इसे उपभोक्ता को पास कर दें। ऐसा होने के बाद, निर्माता अपने टीबीइट्स सदस्य चर का पुन: उपयोग करना चाहता है, इस ज्ञान में सामग्री कि उपभोक्ता अंततः सिस्टम को स्मृति वापस कर देगा। यदि टीबीइट्स एक वस्तु थी, तो मुझे कोई समस्या नहीं होगी, लेकिन मुझे यकीन नहीं है कि इस परिदृश्य में टीबीइट्स कैसे काम करता है।डेल्फी एक्सई टीबीइट्स सही उपयोग
उदाहरण के लिए, ऑब्जेक्ट ए में, मैं कुछ डेटा को एक टीबीइट्स सरणी में इकट्ठा करना चाहता हूं जो ऑब्जेक्ट ए का सदस्य है। जब यह पूरा हो जाता है, तो मैं फिर टीबीइट्स सरणी को किसी अन्य ऑब्जेक्ट बी में पास करना चाहता हूं, जो तब बन जाता है डेटा के मालिक। इस बीच, ऑब्जेक्ट ए में वापस, मैं 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;
अग्रिम धन्यवाद!
स्पष्टीकरण के लिए धन्यवाद। हां, कारण एफडीएटी एक सदस्य चर है क्योंकि निर्माता को टीसीपी सॉकेट से डेटा मिल रहा है, इसलिए इसे आम तौर पर प्रत्येक बार कॉल किए जाने वाले डेटा का केवल एक हिस्सा मिलता है। हां, मैं निर्माता/उपभोक्ता चाहता हूं, और "डेटा के स्वामित्व को स्थानांतरित करने की आवश्यकता" के बारे में टिप्पणी _exactly_ है जो मैं करने की कोशिश कर रहा हूं। और हाँ, decoupled कोड बल्कि जटिल था; इसलिए सरलीकरण। अंत में, मुझे अभी भी यकीन नहीं है कि कैसे "स्वामित्व स्थानांतरित करें" सही तरीके से करें - क्या आप उस मुद्दे को थोड़ा सा स्पष्ट कर सकते हैं? –
उपभोक्ता को संदर्भ लेने दें और फिर निर्माता का संदर्भ छोड़ दें। Consumer.data: = FData; एफडीटा: = शून्य; –