मैं डेल्फी में एक फ़ंक्शन या प्रक्रिया चलाने की कोशिश कर रहा हूं, लेकिन एक घटक का उपयोग किए बिना, क्या डेल्फी कोर फ़ंक्शंस के साथ ऐसा करने का कोई तरीका है?डेल्फी (घटक के बिना) में अतुल्यकालिक रूप से फ़ंक्शन/प्रक्रिया को कॉल करने के लिए कैसे करें
उत्तर
आप भी अपनी प्रक्रिया को थ्रेड पर निष्पादित करना चाहते हैं। परिणाम प्राप्त करने के लिए ऑनटर्मिनेट ईवेंट का उपयोग करें। हां, .NET और C# के इन दिनों में हम एसिंक्रोनियोलॉली के निष्पादन विधियों के आसान और सुविधाजनक रूप से खराब होते हैं, लेकिन यह डेल्फी पर काम करता है।
यदि आप पूछ रहे हैं कि वीसीएल के पास 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()
का उपयोग करके भी संभव है: पूरा होने पर यह घड़ी प्रपत्र को सूचित करें और इंटरफ़ेस संदर्भ रीसेट करने के लिए सक्षम बनाता है।
ऊपर कोड पूर्ण न्यूनतम नहीं है, इसका उद्देश्य केवल कुछ विचारों को प्रदर्शित करना है।
मैंने कल उस पुस्तकालय को देखा, लेकिन मैं कोड को न्यूनतम रखना चाहता था, मुझे लगता है कि मैं इसे किसी भी तरह से समाप्त कर दूंगा। यह एक साधारण .pas इकाई सही है? – Sebastian
हां यह केवल 2 और 3 केएलओसी के बीच है, इसलिए यह पहले से ही काफी कम है। मुझे नहीं लगता कि यह हराया जा सकता है। इंटरफ़ेस बेहद सरल है, सभी बालों वाली सामग्री 'कार्यान्वयन' भाग में है ;-) बस सुनिश्चित करें कि आप कॉल समाप्त होने तक 'IAsyncCall' संदर्भों को रखें, अन्यथा अंतिम संदर्भ गणना कमी अवरुद्ध हो जाएगी। – mghie
ऐसा लगता है कि यह सबसे अच्छा समाधान होगा, बहुत बहुत धन्यवाद। – Sebastian
- 1. घटनाओं को अतुल्यकालिक रूप से
- 2. अटैचमेंट प्रदर्शित करने के लिए आउटलुक के समान डेल्फी घटक
- 3. सी # बाल प्रक्रिया के stdout को अतुल्यकालिक रूप से पढ़ें
- 4. रिंग के बिना प्रोग्रामिक रूप से कॉल अस्वीकार करें
- 5. डेल्फी के लिए सबसे अच्छा रिपोर्टिंग घटक?
- 6. एक्सेल के बिना देशी एक्सएलएस में डेल्फी टीडीटासेट को निर्यात करने के लिए ओपन सोर्स घटक या यूनिट
- 7. रेलवे में मार्गों को गतिशील रूप से कॉल करने के लिए कैसे करें?
- 8. अतुल्यकालिक रूप से x सेकंड के लिए प्रतीक्षा करें और फिर कुछ निष्पादित करें?
- 9. अतुल्यकालिक वेब सेवा के लिए NSURLConnection NSURLRequest प्रॉक्सी कॉल
- 10. कॉल अतुल्यकालिक समारोह पाश
- 11. एंड्रॉइड में प्रोग्राम को कॉल करने के लिए कैसे करें
- 12. वेब वर्कर और D3.js का उपयोग अतुल्यकालिक रूप से ग्राफ उत्पन्न करने के लिए करें?
- 13. विशेष रूप से register_shutdown_function के लिए कॉल करने योग्य विधि के लिए तर्क कैसे पास करें?
- 14. डेल्फी सिस्टम में घटक सहायता फ़ाइलों को एकीकृत करने के लिए कैसे?
- 15. डेल्फी में पैरामीटर के रूप में ऑब्जेक्ट विधि कैसे पास करें, और फिर इसे कॉल करें?
- 16. सही डेल्फी संकलक स्विच उपयोगकर्ता के कोड में बंद करने के लिए, नहीं मेरी घटक के
- 17. फ़ाइल को अतुल्यकालिक रूप से लिखना
- 18. घटना के बिना जेएस फ़ंक्शन को कॉल करने के लिए कैसे करें
- 19. बोर्लैंड वीसीएल में घटक का मूल रूप कैसे प्राप्त करें?
- 20. डेल्फी में WinAPI फ़ंक्शन SetDllDirectory() को कैसे कॉल करें?
- 21. एंड्रॉइड लोड डेटा अतुल्यकालिक रूप से पेजर
- 22. एक सूचीदृश्य को अतुल्यकालिक रूप से कैसे पॉप्युलेट करना है?
- 23. javax स्क्रिप्ट जावा से जावास्क्रिप्ट में फ़ंक्शन को कॉल करने के लिए कैसे करें
- 24. कैसे अतुल्यकालिक रूप से एक टेक्स्ट बॉक्स की स्वत: पूर्ण डेटा लाने के लिए?
- 25. डेल्फी घटक सीरियलाइजेशन
- 26. डेल्फी में जावास्क्रिप्ट को निष्पादित करने के लिए कैसे?
- 27. अतुल्यकालिक समारोह कॉल C++ 0x
- 28. एक सीमा-लेआउट क्षेत्र के भीतर एक घटक को छिपाने के लिए प्रोग्रामिक रूप से
- 29. प्रतिशत चिह्न के बिना प्रतिशत के रूप में एक संख्या को प्रारूपित करने के लिए कैसे?
- 30. गणितीय अभिव्यक्तियों को प्रदर्शित करने के लिए डेल्फी घटक या पुस्तकालय
मेरे पास सी # जेजे में क्या कर रहा है, इसका एक संस्करण है, अब मैं डेल्फी में अनुवाद करने की कोशिश कर रहा हूं (क्योंकि मैं .NET का उपयोग नहीं करना चाहता) मैं देख रहा हूं कि आप क्या कह रहे हैं। धन्यवाद। – Sebastian
मुझे अंत में यह केवल एक साधारण BeginThread के साथ काम कर रहा है, मुझे वास्तव में प्रक्रिया के परिणाम की परवाह नहीं है, इसे सिर्फ कुछ करना है या बाहर निकलना है। आपके संदेश के लिए धन्यवाद। – Sebastian