2010-10-25 11 views
14
में एक पूर्णांक लौट

एक एकल पिरोया आवेदन में मैं इस तरह कोड का उपयोग करने के लिए रास्ता:थ्रेड-सुरक्षित बढ़ा देते और डेल्फी

Interface 
    function GetNextUID : integer; 
Implementation 
    function GetNextUID : integer; 
    const 
     cUID : integer = 0; 
    begin 
     inc(cUID); 
     result := cUID; 
    end; 

इस कोर्स के एक सिंगलटन वस्तु, आदि के रूप में लागू किया जा सकता है - मैं मैं बस सबसे सरल संभव उदाहरण दे रहा हूँ।

प्रश्न: समवर्ती धागे से सुरक्षित परिणाम प्राप्त करने के लिए मैं इस फ़ंक्शन को संशोधित कैसे कर सकता हूं (या कक्षा को डिज़ाइन कर सकता हूं)?

+0

त्वरित उत्तरों के लिए धन्यवाद, हर कोई। मैंने किसी भी तरह से खुद को यह समझाने में कामयाब रहा था कि इंटरलॉकिनक्रिकमेंट इसे वापस किए बिना मूल्य में वृद्धि कर रहा था - यह नहीं कि इससे कोई समझ आएगी, लेकिन मैं उस पर अटक गया। एक बार फिर धन्यवाद। –

उत्तर

35

आप Interlocked* कार्यों का उपयोग कर सकते हैं:

function GetNextUID : integer; 
    {$J+} // Writeble constants 
    const 
     cUID : integer = 0; 
    begin 
     Result := InterlockedIncrement(cUID); 
    end; 

अधिक आधुनिक डेल्फी संस्करणों Atomic* (जैसे AtomicDecrement, AtomicIncrement, आदि) में इन विधियों नाम बदल लें, तो उदाहरण के कोड इस हो जाता है:

function GetNextUID : integer; 
    {$J+} // Writeble constants 
    const 
     cUID : integer = 0; 
    begin 
     Result := AtomicIncrement(cUID); 
    end; 
+0

+1। –

+5

और स्पष्ट रूप से {$ J +} बताते हुए +1। हालांकि मैं GetNextUID को क्लास फ़ंक्शन बनाना पसंद करता हूं और FUID के लिए क्लास var का उपयोग करता हूं, सिर्फ इसलिए कि मैं स्थिरांक का दुरुपयोग करने से नापसंद करता हूं। –

+0

नोट: इंटरलॉक फ़ंक्शंस फायरमॉन्की में उपलब्ध नहीं है (वृद्धि/कमी के लिए एक क्रॉस प्लेटफ़ॉर्म तरीका होना चाहिए?) –

15

सबसे आसान तरीका शायद नौकरी करने के लिए InterlockedIncrement पर कॉल करना होगा।

+0

लेकिन ध्यान दें: FireMonkey में उपलब्ध नहीं है। वृद्धि/कमी के लिए क्रॉस प्लेटफार्म रास्ता? उदाहरण देने के लिए –

4

आधुनिक डेल्फी कंपाइलर्स के साथ यूनिट सिस्टम से सिंक TInterlocked के Increment फ़ंक्शन का उपयोग करना बेहतर है। सिंक ऑब्जेस। कुछ ऐसा:

type 
    TMyClass = class 
    class var 
     FIdCounter: int64; 
    var 
     FId: int64; 
    constructor Create; 
    end; 

constructor TMyClass.Create; 
begin 
    FId := TInterlocked.Increment(FIdCounter); 
end; 

यह कोड प्लेटफ़ॉर्म-स्वतंत्र रखने में मदद करता है।

संबंधित मुद्दे