2011-10-11 15 views
24

मैंने कुछ समय पहले लोगों को डेल्फी एक्सई में नए मल्टीथ्रेडिंग के बारे में चर्चा करने के बारे में देखा है और इस तथ्य के बारे में कि डेल्फी के पास कुछ 'मूल' समस्याएं हैं, जिस तरह से यह मल्टीथ्रेडिंग लागू करता है। और वे डिफ़ॉल्ट डेल्फी मल्टीथ्रेडिंग को प्रतिस्थापित करने के लिए कुछ बाहरी पुस्तकालयों की सिफारिश कर रहे थे।डेल्फी एक्सई में मल्टीथ्रेडिंग में नया क्या है?

क्या आप मुझे कुछ दस्तावेज और डेल्फी एक्सई के लिए सबसे लोकप्रिय मल्टीथ्रेडिंग लाइब्रेरी में इंगित कर सकते हैं? धन्यवाद

+0

मुझे नई सुविधाओं में से एक याद आया: डेल्फी एक्सई के तहत आप एक धागे का नाम दे सकते हैं। ठंडा। अन्य हैं? – Ampere

+6

'TThread.NameThreadForDebugging' D2010 में मौजूद है। मुझे विश्वास नहीं है कि डेल्फी के साथ जहाजों के थ्रेडिंग कोड के साथ कोई गंभीर समस्या है। सबसे लोकप्रिय और सर्वोत्तम थ्रेडिंग लाइब्रेरी [OmniThreadLibrary] है (http://otl.17slon.com/) लेकिन @ gabr ऐसा कहने के लिए बहुत मामूली है। –

+1

डेल्फी के पास थ्रेडिंग लागू करने के तरीके के साथ कोई "मूल समस्याएं" नहीं हैं। मैं बिना किसी वास्तविक परेशानी के 2003 से टीटीएचड के आधार पर कक्षाओं का उपयोग कर रहा हूं। हालांकि, आप खुद को परेशानी बचाने के लिए किसी भी मौजूदा तृतीय-पक्ष थ्रेडिंग फ्रेमवर्क से शुरुआत करना चाहते हैं। – Misha

उत्तर

7

मेरा मानना ​​है कि हाल में शुरू की सुविधाओं के सभी पहले से ही कवर किया गया।

प्रलेखन भाग के लिए, यहां क्लासिक ट्यूटोरियल पुस्तक Martin Harvey. Multithreading - The Delphi Way. पर एक संग्रहित प्रति है, पढ़ने के बाद आपको सबसे अधिक संभावना है कि किसी भी योगदान पुस्तकालयों (सिवाय, शायद, थ्रेड पूल) के लिए कोई वास्तविक आवश्यकता नहीं है, याद रखें, ढांचे हैं आपके लिए चीजों को सरल नहीं बनाते, वे आपको ठीक अनाज नियंत्रण से वंचित भी करते हैं।

+1

सीसी में भी उपलब्ध है: [मल्टीथ्रेडिंग - डेल्फी तरीका (अपडेट: वी 1.1)] (http://cc.embarcadero.com/Item/14809)। इसके अलावा [मल्टीथ्रेडिंग - असिंक अधिसूचना पुस्तकालय (वी 1.2)] (http://cc.embarcadero.com/Item/21570) –

+0

@ टोंड्रेज, एक अनुक्रम! :-) धन्यवाद! –

25

[आप धागा नाम सेट कर सकते हैं:। TThread.NameThreadForDebugging] (D2010 में लागू के रूप में डेविड ने बताया)

आप गुमनाम धागा (एक धागा गुमनाम फ़ंक्शन निष्पादित और एक TThread की जरूरत नहीं है कि बना सकते हैं वंशज वस्तु): TThread.CreateAnonymousThread।

डेल्फी सूत्रण चौखटे यहां चर्चा कर रहे हैं:

+0

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

+1

@Warren क्या उस इच्छा का कोई कारण है? –

+1

वॉरेन, कोई भी आपको रोक नहीं रहा है :) हालांकि, ऐसे समय होते हैं जब अज्ञात पृष्ठभूमि कार्यकर्ता पर्याप्त होता है। – gabr

7

gabr शायद मुख्य नए संयोजन का उल्लेख किया। संभवतः छोड़ा गया था TThread के लिए नया अधिभार। सिंक्रनाइज़ और TThread.Queue जो अब अज्ञात विधियों को निष्पादित कर सकता है।

12

मुझे लगता है कि "मूल" मुद्दों के बारे में आप जिस तरह से TThread से संबंधित नहीं हैं बात कर रहे हैं कार्यान्वित किया जाता है, लेकिन RTL के अन्य पहलुओं के लिए:

  • स्मृति प्रबंधक, बहुत तेजी से और अच्छी तरह से लिखा है, लेकिन एकाधिक कोर पर कई समवर्ती धागे के साथ चलते समय यह एक रैखिक तरीके से स्केल करने में विफल रहता है;
  • संदर्भ बार गणना प्रकार (string और गतिशील सरणियों की तरह), परमाणु संदर्भ गिनती (64 में InterlockedDecrement/InterlockedIncrement) है, जो भी मल्टी-थ्रेडेड आवेदनों पर बुरी तरह पैमाने पर कर सकते हैं (जो है के लिए एक एएसएम lock opcode के साथ लागू किया जाता है जब यह ओपोड निष्पादित होता है तो सभी कोर फ्रीज होते हैं - भले ही नए CPUs ने इसके बारे में प्रगति की हो, RCU कार्यान्वयन बेहतर हो सकता है)।

उन कमजोरी सभी बहु धागा पुस्तकालयों के लिए आम हैं - यहां तक ​​कि OTLthis के बारे में भुगतना होगा। वे बहुत जल्दी डेल्फी संस्करणों के बाद से मौजूद हैं, और अभी भी डेल्फी XE2 के साथ हैं। 64 बिट कार्यान्वयन समान है (यहां तक ​​कि धीमा), और मैक ओएस प्लेटफार्म एक ही कार्यान्वयन साझा करता है।

डेल्फी में स्केलिंग बहु-थ्रेडेड अनुप्रयोगों को लिखने के तरीके के बारे में this other SO question देखें।

ईमानदार होने के लिए, उपरोक्त दोनों बिंदु केवल कुछ विशिष्ट प्रकार के अनुप्रयोगों पर दिखाई देंगे।

तो डेल्फी में बहु-थ्रेडिंग के बारे में चिंता करने की कोई बात नहीं है, अगर आप उन बिंदुओं को जानते हैं, और अपने धागे में मेमोरी मैनेजर कॉल या स्ट्रिंग प्रक्रिया का दुरुपयोग नहीं करते हैं।

13

इसके अलावा, क्या पहले ही उल्लेख किया गया है के अलावा:

  • वहाँ बाहरी धागे (TThread.CurrentThread वर्ग संपत्ति के माध्यम से सुलभ) के लिए TExternalThread आवरण है।
  • आईडीई में डिबगिंग करते समय, अब आप freeze and thaw व्यक्तिगत धागे कर सकते हैं। SyncObjs इकाई में नई सामग्री की
  • एक बहुत: condition variables, TLightweightEvent, TLightweightSemaphore, TSpinLock, TSpinWait, TInterlocked और अधिक के लिए समर्थन ...
4

XT में TThreadedQueue पेश किया गया था।

मुझे कार्यकर्ता धागे से मुख्य धागे या अन्य उपभोक्ता धागे से जानकारी पास करने के लिए उपयोगी लगता है। आखिरी हिस्सा, जिसमें एकाधिक उपभोक्ता धागे हैं, दुर्भाग्य से छोटी गाड़ी थीं। डेल्फी 200 9 में पेश की गई एक कक्षा, टीएमओनिटर में एक बग थी, जो टीटीएच्रेडेड क्यूई में कतार तक पहुंच को सिंक्रनाइज़ करने के लिए उपयोग की जाती थी।

यह XE2 के लिए तय किया गया है। tthreadedqueue-not-capable-of-multiple-consumers

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