2009-12-02 4 views
7

मैं डेल्फी में एक फ़ंक्शन या प्रक्रिया चलाने की कोशिश कर रहा हूं, लेकिन एक घटक का उपयोग किए बिना, क्या डेल्फी कोर फ़ंक्शंस के साथ ऐसा करने का कोई तरीका है?डेल्फी (घटक के बिना) में अतुल्यकालिक रूप से फ़ंक्शन/प्रक्रिया को कॉल करने के लिए कैसे करें

उत्तर

4

आप भी अपनी प्रक्रिया को थ्रेड पर निष्पादित करना चाहते हैं। परिणाम प्राप्त करने के लिए ऑनटर्मिनेट ईवेंट का उपयोग करें। हां, .NET और C# के इन दिनों में हम एसिंक्रोनियोलॉली के निष्पादन विधियों के आसान और सुविधाजनक रूप से खराब होते हैं, लेकिन यह डेल्फी पर काम करता है।

+0

मेरे पास सी # जेजे में क्या कर रहा है, इसका एक संस्करण है, अब मैं डेल्फी में अनुवाद करने की कोशिश कर रहा हूं (क्योंकि मैं .NET का उपयोग नहीं करना चाहता) मैं देख रहा हूं कि आप क्या कह रहे हैं। धन्यवाद। – Sebastian

+0

मुझे अंत में यह केवल एक साधारण BeginThread के साथ काम कर रहा है, मुझे वास्तव में प्रक्रिया के परिणाम की परवाह नहीं है, इसे सिर्फ कुछ करना है या बाहर निकलना है। आपके संदेश के लिए धन्यवाद। – Sebastian

16

यदि आप पूछ रहे हैं कि वीसीएल के पास like BeginInvoke in .NET आउट-ऑफ-द-बॉक्स है, तो उत्तर नहीं है। हालांकि, आप एंड्रॉइड होउस्लाडेन द्वारा AsyncCalls लाइब्रेरी को अपने प्रोग्राम से लिंक करने वाली छोटी इकाई के रूप में कुछ समान मिल सकते हैं। यह एक घटक नहीं है, इसलिए मुझे लगता है कि यह योग्यता प्राप्त करता है। यह संस्करण 5 से डेल्फी का भी समर्थन करता है। बहुत अधिक अनुशंसित।

संपादित करें:

मैं एक उदाहरण जोड़ देंगे जब से तुम इसे चलाने नहीं मिला। यदि आप अपने कॉलिंग कोड में अवरुद्ध हो जाते हैं तो आपकी समस्या यह है कि IAsyncCall इंटरफ़ेस पॉइंटर पर कोई संदर्भ नहीं रखा गया है जो फ़ंक्शन लौटाया गया है। अस्थायी संदर्भ दायरे से बाहर होने पर इंटरफ़ेस को लागू करने वाला ऑब्जेक्ट तुरंत नष्ट हो जाएगा। विनाशक को वीसीएल थ्रेड के संदर्भ में बुलाया जाएगा, और यह WaitForSingleObject() या कार्यकर्ता धागे को समाप्त करने के लिए प्रतीक्षा करने के लिए एक समान कार्य करेगा। इसका नतीजा यह है कि आपका वीसीएल थ्रेड ब्लॉक।

यदि आप इंटरफ़ेस सूचक के लिए एक संदर्भ को बनाए रखने के सही व्यवहार मिल जाएगा:

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    Timer1: TTimer; 
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
    procedure Button1Click(Sender: TObject); 
    procedure Timer1Timer(Sender: TObject); 
    private 
    fAsyncCall: IAsyncCall; 
    procedure WaitForIt(ADelay: integer); 
    end; 

टाइमर अक्षम और यह एक बहुत ही कम Interval है जाने के लिए सेट, 50 एमएस का कहना है। बटन क्लिक एसिंक्रोनस ऑपरेशन शुरू करता है:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Button1.Enabled := FALSE; 
    fAsyncCall := AsyncCall(WaitForIt, 1000); 
end; 

procedure TForm1.WaitForIt(ADelay: integer); 
begin 
    Sleep(ADelay); 

    EnterMainThread; 
    try 
    Randomize; 
    Color := RGB(Random(256), Random(256), Random(256)); 
    Timer1.Enabled := TRUE; 
    finally 
    LeaveMainThread; 
    end; 
end; 

जबकि ऑपरेशन सक्रिय है अन्य कोई भी प्रारंभ नहीं किया जा सकता है।

procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
    Timer1.Enabled := FALSE; 
    Assert((fAsyncCall <> nil) and fAsyncCall.Finished); 
    fAsyncCall := nil; 
    Button1.Enabled := TRUE; 
end; 

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
    CanClose := (fAsyncCall = nil) or fAsyncCall.Finished; 
end; 

नोट कैसे यह कहा जाता है, विधि से सीधे फ़ॉर्म तक पहुंचने की EnterMainThread() और LeaveMainThread() का उपयोग करके भी संभव है: पूरा होने पर यह घड़ी प्रपत्र को सूचित करें और इंटरफ़ेस संदर्भ रीसेट करने के लिए सक्षम बनाता है।

ऊपर कोड पूर्ण न्यूनतम नहीं है, इसका उद्देश्य केवल कुछ विचारों को प्रदर्शित करना है।

+0

मैंने कल उस पुस्तकालय को देखा, लेकिन मैं कोड को न्यूनतम रखना चाहता था, मुझे लगता है कि मैं इसे किसी भी तरह से समाप्त कर दूंगा। यह एक साधारण .pas इकाई सही है? – Sebastian

+0

हां यह केवल 2 और 3 केएलओसी के बीच है, इसलिए यह पहले से ही काफी कम है। मुझे नहीं लगता कि यह हराया जा सकता है। इंटरफ़ेस बेहद सरल है, सभी बालों वाली सामग्री 'कार्यान्वयन' भाग में है ;-) बस सुनिश्चित करें कि आप कॉल समाप्त होने तक 'IAsyncCall' संदर्भों को रखें, अन्यथा अंतिम संदर्भ गणना कमी अवरुद्ध हो जाएगी। – mghie

+0

ऐसा लगता है कि यह सबसे अच्छा समाधान होगा, बहुत बहुत धन्यवाद। – Sebastian

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