घर
Top.Mail.Ru Yandeks.Metrika
मंच: "अन्य";
वर्तमान संग्रह: 2017.03.12;
डाउनलोड करें: [xml.tar.bz2];

नीचे

कैसे जीना है? इसी तरह की शाखाएँ खोजें


Dimka Maslov ©   (2016-03-23 20:53) [0]

प्राचीन समय में, मैंने मेमोरी लीक की तलाश के लिए FastMM का उपयोग किया था। सब कुछ ठीक था। लेकिन अब, गंभीर परीक्षणों के वर्तमान वर्ष में, मेरे अंदर डेल्फी एक्सएएनएएनएक्सएक्स के आगमन के साथ, मैंने देखा कि फास्टएमएम की अब कोई आवश्यकता नहीं है, लेकिन यह केवल रिपोर्टमेमोरीलॉन्सेन्शियलडाउन में इंगित करने के लिए पर्याप्त है: = सच। ऐसा लगता है कि सब ठीक है, लेकिन कुछ अच्छा नहीं है। अर्थात्, पहले मैं सब कुछ कॉन्फ़िगर कर सकता था ताकि जब मैं कार्यक्रम छोड़ दूं, तो एक फ़ाइल भी बनाई जाएगी, जो यह बताएगी कि लीक हुआ ब्लॉक कहां आवंटित किया गया था। अब आप केवल उस वर्ग का नाम पता कर सकते हैं, जो लीक हुआ है। या सभी एक ही, आप किसी भी तरह से कर सकते हैं?



Rouse_ ©   (2016-03-23 21:02) [1]

FastMM (यदि यह नहीं माना जाता है कि यह डेल्फी में पहले से ही लागू है) ठीक काम करता है और पुराने संस्करण के रूप में - बाहरी पुस्तकालय का उपयोग करता है, जो इस लॉग को बनाने के लिए बिल्कुल जिम्मेदार है।



Dimka Maslov ©   (2016-03-23 22:03) [2]

यानी पहले की तरह सब कुछ करो और सब कुछ काम करेगा? और अगर मेरे पास 64-bit अनुप्रयोग है? (और मेरे पास वास्तव में 64 बिट्स हैं)।



DVM ©   (2016-03-23 22:54) [3]


>
> डिमका मैस्लोव © (23.03.16 20: 53)

डेल्फी में, जहां तक ​​मुझे पता है, एक स्ट्रिप-डाउन FastMM4 एम्बेडेड है। किसी को भी जोड़ने और सामान्य करने के लिए मना नहीं किया।



Rouse_ ©   (2016-03-23 23:47) [4]

64 बिट के लिए मैं आपको नहीं बताऊंगा - 32 बिट्स में, मानदंड काम करते हैं।



Дмитрий Белькевич ©   (2016-03-24 00:35) [5]

64 मानदंड भी। और हां, कटे हुए की तरह। मैं जोड़ता हूं।



Dimka Maslov ©   (2016-03-24 08:38) [6]

मैं देखता हूं, धन्यवाद।

केवल यहाँ एक और सवाल है। क्यों जब मैं थ्रेड बॉडी के अंदर (एक्सक्यूट विधि में ओवरलैप किया गया) फ्री करता हूं - यह थ्रेड क्लास से गैर-मुक्त मेमोरी पर शपथ लेता है (हालांकि विध्वंसक काम करता है और सभी फ़ील्ड और ऑब्जेक्ट रिलीज़ हो जाते हैं), लेकिन जब मैं FreeTTerminate निर्दिष्ट करता हूं: = True और समाप्त करें, यह कसम नहीं है? क्या यह एक और बग है?



Владислав ©   (2016-03-24 10:31) [7]

> डिमका मैस्लोव © (24.03.16 08: 38) [6]

क्यों जब मैं थ्रेड बॉडी के अंदर (एक्सक्यूट विधि में ओवरलैप किया गया) फ्री करता हूं

नि: शुल्क, निष्पादन योग्य धागे की कक्षा का एक उदाहरण ???



Dimka Maslov ©   (2016-03-24 10:45) [8]


> मुक्त करने के लिए, निष्पादन योग्य धागे की कक्षा का एक उदाहरण ???


और कौन?



Юрий Зотов ©   (2016-03-24 11:03) [9]

अर्थात्, एक वस्तु को एक धागे में बनाया गया, और दूसरे में नष्ट किया गया?



Dimka Maslov ©   (2016-03-24 11:04) [10]


> अर्थात्, एक वस्तु को एक धागे में बनाया गया था, और नष्ट कर दिया गया था
> दूसरे में?


इसमें गलत क्या है?



Владислав ©   (2016-03-24 12:16) [11]

> डिमका मैस्लोव © (24.03.16 10: 45) [8]

और कौन?

यह स्ट्रीम फ़ंक्शन है:

फ़ंक्शन थ्रेडप्रोक (थ्रेड: TThread): पूर्णांक; ... शुरू करना ... कोशिश यदि नहीं कोशिश Thread.Execute; <========= यहाँ आप एक कॉपी धमाका करते हैं सिवाय Thread.FFatalException: = AcquireExceptionObject; <======= अगले पाठ में दुर्घटनाग्रस्त उदाहरण के लिए अपील कर रहे हैं। अंत; अंत में FreeThread: = Thread.FFreeOnTerminate; परिणाम: = थ्रेड। फ़र्नीचरवैल्यू; Thread.DoTerminate; सूत्र। पूर्ण: = सत्य; SignalSyncEvent; यदि FreeThread है तो Thread.Free; <=========== और यहाँ कॉपी फिर से क्रैश हो सकती है ... अंत;



Dimka Maslov ©   (2016-03-24 12:39) [12]


> यहां आप एक कॉपी धमाका करते हैं


यही सवाल है कि वह दुर्घटना नहीं करता है।



Владислав ©   (2016-03-24 13:45) [13]

बनूंगी:

"... (हालांकि विध्वंसक काम करता है और वस्तुओं और तारों के सभी क्षेत्रों को मुक्त कर दिया जाता है) ..."

और इसलिए ऐसा करना असंभव है (Execute पद्धति में TThread वर्ग का एक उदाहरण जारी करें)!

"... लेकिन जब मैं FreeOnTerminate निर्दिष्ट करता हूं: = सही और समाप्त ..."

इसलिए, जैसा कि ऊपर लिखा गया है, ऐसा करें, क्योंकि स्ट्रीम शुरू करने के बाद आपको किसी इंस्टेंस की आवश्यकता नहीं है।



Dimka Maslov ©   (2016-03-24 14:10) [14]

सामान्य तौर पर, CreateThread - हमारे सभी!



NoUser ©   (2016-03-24 14:27) [15]

> क्या यह एक और बग है?
हाँ, TThread बुराई है - BeginTread हमारी सब कुछ है))
नि: शुल्क -> WaitForSingleObject (FHandle, INFINITE); //!



Владислав ©   (2016-03-24 14:49) [16]

> डिमका मैस्लोव © (24.03.16 14: 10) [14]

हाँ, क्यों। इस विषय पर थोड़ा पढ़ें।

अच्छी तरह से और केवल CreateThread नहीं, लेकिन BeginThread।



Dimka Maslov ©   (2016-03-24 20:15) [17]

तकी बनाएं https://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx



Nouser ©   (2016-03-24 21:00) [18]

बिक्री तले हुए हैं: _beginthread / ex
और इसलिए आप इस छोटी सी चीज को हिला सकते हैं
TWork.Add (BeginThread (nil, 0, @ TWork.Run, TWork.Create, 0, PCardinal (0) ^))); //))



Владислав ©   (2016-03-24 22:23) [19]

> डिमका मैस्लोव © (24.03.16 20: 15) [17]

और अभी भी पढ़ सकते हैं? या सबसे दिलचस्प एक रेक पर? :)



Dimka Maslov ©   (2016-03-24 22:59) [20]

तो मैं पढ़ता हूं। सब कुछ स्पष्ट और स्पष्ट रूप से लिखा गया है। साई के विपरीत कुछ कार्यालय।



DVM ©   (2016-03-24 23:17) [21]


> डिमका मैस्लोव © (24.03.16 20: 15) [17]

1) क्रॉस-प्लेटफॉर्म नहीं
2) ऑटोमेटन द्वारा ध्वज को स्थापित नहीं किया जाता है।



Kerk ©   (2016-03-24 23:57) [22]

और रनटाइम में मेमोरी का उपयोग क्या देख सकता है? के अर्थ में - एक तस्वीर लें और देखें कि कौन, कितना और किस मेमोरी के लिए आवंटित किया गया है। क्या यह मुफ्त है?



Германн ©   (2016-03-25 01:55) [23]


> डिमका मैस्लोव © (24.03.16 12: 39) [12]
>
>
>> यहाँ आप एक कॉपी धमाका
>
>
> सवाल यह है कि वह बिल्कुल भी क्रैश नहीं करता है।

किस आधार पर ऐसा निष्कर्ष निकाला गया।



Eraser ©   (2016-03-25 05:38) [24]


> डिमका मैस्लोव © (24.03.16 08: 38) [6]

TThread डेल्फी में सबसे सुविधाजनक वर्गों में से एक है। जब तक डेल्फी के नवीनतम संस्करणों में स्ट्रीमिंग नवाचारों का मुकाबला नहीं किया जा सकता (समानांतर परिवाद)।
TThread का उपयोग करने से पहले, आपको अपनी विचारधारा को भेदने की आवश्यकता है, कम से कम सतही रूप से, और अपने भीतर किसी वस्तु को हटाने के लिए नहीं।
TThread की ताकत में से एक OnTerminate घटना है, जो हमेशा मुख्य धागे के संदर्भ में चलती है।

सामान्य तौर पर, एक आधुनिक टीथ्रेड जो बस नहीं कर सकता है।

प्रक्रिया TForm1.Button1 क्लिक करें (प्रेषक: TObject); वर मैं: इंटेगर; शुरू करना I: = 1; TThread.CreateAnonymThread ( प्रक्रिया शुरू करना इंक (I); TThread.Queue (nil, प्रक्रिया शुरू करना ShowMessage (I.ToString); अंत ); अंत ) .स्टार्ट; अंत;



Dimka Maslov ©   (2016-03-25 09:38) [25]


> 1) क्रॉस-प्लेटफॉर्म नहीं


और कुत्ता उसके साथ।


> किस आधार पर ऐसा निष्कर्ष बनाया गया था।


मेमोरी लीक विश्लेषण के आधार पर।


> OnTerminate इवेंट


इसे आसानी से SendMessage (Application.MainFormHandle, .....) द्वारा बदल दिया जाता है, जो मुख्य धागे के संदर्भ में भी चलता है।



DVM ©   (2016-03-25 11:41) [26]


> डिमका मैस्लोव © (25.03.16 09: 38) [25]


> आसानी से SendMessage (Application.MainFormHandle, के साथ प्रतिस्थापित)
> .....), जो मुख्य धागे के संदर्भ में भी चलता है।

कार्यक्रम में खिड़कियों की उपस्थिति और संदेश पुनर्प्राप्ति चक्र के अधीन। OnTerminate को विंडोज़ की आवश्यकता नहीं होती है।



NoUser ©   (2016-03-25 14:48) [27]

> OnTerminate को विंडोज़ की आवश्यकता नहीं होती है।
और फिर क्या आवश्यक है?



DVM ©   (2016-03-25 17:00) [28]


> NoUser © (25.03.16 14: 48) [27]


> और फिर क्या आवश्यक है?

सिंक्रनाइज के माध्यम से ऑनरिमनेट कहा जाता है। वर्तमान सिंक्रनाइज़ेशन अब पहले की तरह संदेशों का उपयोग नहीं करता है। विवरण के लिए सिंक्रनाइज़ेशन कार्यान्वयन देखें।



NoUser ©   (2016-03-25 17:50) [29]

इसलिए, मैं सोच रहा हूं कि मुख्य धागा (बिना खिड़कियों के) कैसे बनाया जाए ताकि यह ऑनटर्मिनेट वहां काम कर सके?



DVM ©   (2016-03-25 18:17) [30]


> तो, मुझे आश्चर्य है कि मुख्य धागा कैसे बनाया जाए (विंडोज़ के बिना),
> कि इस OnTerminate ने वहां काम किया?

कार्यक्रम Project1; {$ APPTYPE CONSOLE} {$ R * .res} का उपयोग करता है System.SysUtils, System.Classes; टाइप TMyThread = वर्ग (TThread) संरक्षित प्रक्रिया निष्पादन; ओवरराइड; अंत; TMyClass = वर्ग निजी FSecondThread: TMyThread; प्रक्रिया थ्रेडट्रिमनेटेड (प्रेषक: TObject); सार्वजनिक निर्माता बनाएँ; नाश करने वाला; ओवरराइड; प्रक्रिया चलाने; अंत; वर MyClass: TMyClass; {} TMyClass निर्माता TMyClass.Create; शुरू करना विरासत में मिला; FSecondThread: = TMyThread.Create; FSecondThread.FreeOnTerminate: = सच; FSecondThread। OnTerminate: = थ्रेडट्रिमनेटेड; अंत; विध्वंसक TMyClass.Destroy; शुरू करना FSecondThread.Free; विरासत में मिला; अंत; प्रक्रिया TMyClass.Run; वर i: पूर्णांक; शुरू करना I के लिए: = 0 to 9 do शुरू करना Writeln (I); CheckSynchronize; नींद (1000); अंत; अंत; प्रक्रिया TMyClass.ThreadTreminated (प्रेषक: Tobject); शुरू करना रिटेलन ("दूसरा धागा समाप्त"); अंत; {} TMyThread प्रक्रिया TMyThread.Execute; शुरू करना रिटेलन ("दूसरा धागा शुरू"); नींद (2000); रिटेलन ("दूसरा धागा अंत"); अंत; शुरू करना कोशिश MyClass: = TMyClass.Create; कोशिश MyClass.Run; अंत में MyClass.Free; अंत; सिवाय E पर: अपवाद करते हैं Writeln (E.ClassName, ":", E.Message); अंत; readln; अंत।



DVM ©   (2016-03-25 18:20) [31]

एक छोटा स्पष्टीकरण, FSecondThread.FreeOnTerminate को हटाना आवश्यक है: = सच;



NoUser ©   (2016-03-25 19:07) [32]

धन्यवाद, लेकिन जैसा कि मैंने सोचा था, चमत्कार नहीं हुआ - CheckSynchronize।
खतरा.
और Dx का कौन सा संस्करण?



DVM ©   (2016-03-25 21:46) [33]


> NoUser © (25.03.16 19: 07) [32]


> चमत्कार नहीं हुआ - CheckSynchronize

बेशक, कोई चमत्कार नहीं है और नहीं हो सकता है। कोई भी नहीं बल्कि धागा स्वयं अपने संदर्भ में कोड निष्पादित कर सकता है। वास्तव में CheckSynchronize के अंदर, थ्रेड द्वारा निष्पादन और निष्पादन के लिए कतार से कार्रवाई की जाती है।


> और Dx का कौन सा संस्करण?
>
>

मेरे पास एक D8 है। लेकिन CheckSynchronize लंबे समय से आसपास रहा है, 2009 में यह पहले से ही था, ऐसा लगता है, और शायद पहले भी।



Германн ©   (2016-03-25 23:05) [34]

इससे पहले कि। D2007 में था।



Dimka Maslov ©   (2016-03-27 09:45) [35]


> वर्तमान सिंक्रनाइज़ेशन अब संदेशों का उपयोग नहीं करता है।


यदि आप गहराई से खुदाई करते हैं, तो वर्तमान सिंक्रनाइज़ेशन WakeMainThread (वैश्विक घटना) का उपयोग करता है, जो Application.WakeMainThread, जिसके अंदर सेट है PostMessage(हैंडल, WM_NULL, 0, 0) एप्लिकेशन ऑब्जेक्ट के लिए खुद को, जो CheckSynchronize कहता है।

इस प्रकार, हम निष्कर्ष निकालते हैं कि कोई सिंक्रनाइज़ नहीं है जो अब संदेशों का उपयोग नहीं करता है ...



DVM ©   (2016-03-27 10:27) [36]


> डिमका मैस्लोव © (27.03.16 09: 45) [35]


> जिसमें पोस्टमैसेज किया जाता है (हैंडल, WM_NULL, 0,)
> 0) एप्लिकेशन ऑब्जेक्ट पर ही जाता है, जो चेकसिंक्रनाइज़ कहता है।
>

आप लोगों को भ्रमित न करें। यह केवल एप्लिकेशन ऑब्जेक्ट की आंतरिक रसोई है, सिंक्रोनाइज नहीं। तथ्य यह है कि आवेदन WakeMainThread के लिए इस तरह प्रतिक्रिया करता है केवल उसका व्यवसाय है। जैसा कि मैंने ऊपर दिखाया था, किसी भी एप्लिकेशन, विंडोज़ और संदेश चयन चक्रों के बिना सिंक्रोनाइज़ काम कर सकता है। एप्लिकेशन ऑब्जेक्ट में, यह पूरी तरह से सिंक्रोनाइज करने के लिए अपनी जवाबदेही को बढ़ाने के उद्देश्य से किया जाता है, उसी सफलता के साथ यह एक बार एक सेकंड में चेकसिंक सिंक्रनाइज़ कर सकता है।



Dimka Maslov ©   (2016-03-27 10:44) [37]


> DVM © (27.03.16 10: 27) [36]


लेकिन आखिरकार, अगर कोई संदेश प्रसंस्करण चक्र नहीं है और मैंने खुद को चेकसिंक्रनाइज़ करने के लिए परेशान नहीं किया है, तो मुख्य धागे के साथ सिंक्रनाइज़ेशन बिल्कुल भी काम नहीं करेगा! इसके अलावा, System.Classes.TThread.Synchronize के विवरण में CheckSynchronize के बारे में स्पष्ट रूप से कुछ नहीं कहा गया है। यह भी देखें में पढ़ने के लिए कवर के नीचे से अनुमान लगाना आवश्यक है।

और अधिक। लगभग पांच साल पहले एक बार, मैंने इस बहुत ही सिंक्रोनाइज़ के माध्यम से मुख्य के साथ कम्प्यूटेशनल प्रवाह का सिंक्रोनाइज़ेशन किया था। इसने इतनी धीमी गति से काम किया कि गिनना असंभव हो गया। मुझे यह सब फेंकना पड़ा और आलोचनात्मक धाराएँ डालनी पड़ीं।



DVM ©   (2016-03-27 10:51) [38]


> लेकिन अगर कोई संदेश प्रसंस्करण चक्र नहीं है और मैंने ध्यान नहीं दिया
> CheckSynchronize चेक करें, फिर मुख्य के साथ सिंक्रोनाइज़ेशन करें
> प्रवाह बिलकुल नहीं चलेगा!

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


> एक बार, लगभग पांच साल पहले, मैंने कम्प्यूटेशनल के सिंक्रनाइज़ेशन को बनाया
> यह बहुत सिंक्रनाइज़ के माध्यम से मुख्य एक के साथ प्रवाह। काम
> इतनी धीरे-धीरे कि गिनती करना असंभव हो गया।
>

खैर, यह जीयूआई स्ट्रीम के साथ सिंक्रनाइज़ेशन के लिए सभी समान विचार था, शायद ही किसी विशेष गति की आवश्यकता हो। जो कोई भी एक दूसरे के साथ अपने धागे को सिंक्रनाइज़ करना चाहता है, वह प्रत्येक मामले में अधिक कुशल कार्यान्वयन के साथ आएगा। सामान्य तौर पर, IMHO - सिंक्रनाइज़ेशन बुराई है, आप सिंक्रनाइज़ नहीं कर सकते - सिंक्रनाइज़ नहीं करें।



Dimka Maslov ©   (2016-03-27 11:09) [39]


> सिंक्रोनाइज़ेशन बुराई है, आप सिंक्रोनाइज़ नहीं कर सकते - सिंक्रोनाइज़ न करें


सुनहरे शब्द। बस डेल्फी में सिंक नहीं कर सकते।



DVM ©   (2016-03-27 11:26) [40]


> डिमका मैस्लोव © (27.03.16 11: 09) [39]


> बस डेल्फी में सिंक नहीं कर सकते।

जीयूआई के साथ, हां, लेकिन अन्य मामलों में आप काम करने के विकल्प के साथ आ सकते हैं। हालांकि डेल्फी में कोई लॉकफ्री डेटा संरचना नहीं है, आप उन्हें खुद लिख सकते हैं। उदाहरण के लिए, कतार इसके लिए पहला उम्मीदवार है।



Eraser ©   (2016-03-27 14:00) [41]

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



DVM ©   (2016-03-27 15:51) [42]


> इरेज़र © (27.03.16 14: 00) [41]
> सिंक्रनाइजेशन वास्तव में एक बैसाखी है
> अत्यंत दुर्लभ।

संभवतः आप विशेष रूप से सिंक्रोनाइज़ के बारे में हैं। सामान्य तौर पर, मेरे पास शायद ही कोई धागा है, जो किसी भी संसाधनों के लिए सिंक्रनाइज़ किए बिना नहीं है।



Eraser ©   (2016-03-27 16:18) [43]


> संभवतः आप विशेष रूप से सिंक्रोनाइज़ के बारे में बात कर रहे हैं

हां, उसके बारे में।



पन्ने: 1 2 पूरी शाखा

मंच: "अन्य";
वर्तमान संग्रह: 2017.03.12;
डाउनलोड करें: [xml.tar.bz2];

ऊपर









मेमोरी: 0.74 एमबी
समय: 0.033 c
15-1459032676
Kilkennycat
2016-03-27 01:51
2017.03.12
क्यूटी।


8-1208967764
Darkmoon
2008-04-23 20:22
2017.03.12
Альфа канал


1-1349251842
de_guta
2012-10-03 12:10
2017.03.12
सरणी के लिए लिखने के साथ समस्या


3-1312799506
चौथाई गेलन
2011-08-08 14:31
2017.03.12
खाली GUID


15-1458755602
डिमका मास्लोव
2016-03-23 20:53
2017.03.12
कैसे जीना है?





अफ्रीकी अल्बानियन अरबी भाषा अर्मेनियाई आज़रबाइजानी बस्क बेलारूसी बल्गेरियाई कैटलन सरलीकृत चीनी) चीनी पारंपरिक) क्रोएशियाई चेक डेनिश डच अंग्रेज़ी एस्तोनियावासी फिलिपिनो फिनिश फ्रेंच
गैलिशियन् जॉर्जियाई जर्मन यूनानी हाईटियन यहूदी हिंदी हंगरी आइसलैंड का इन्डोनेशियाई आयरिश इतालवी जापानी कोरियाई लात्वीयावासी लिथुआनियाई मेसीडोनियन मलायी मोलतिज़ नार्वेजियन
फ़ारसी पोलिश पुर्तगाली रोमानियाई रूसी सर्बियाई स्लोवाक स्लोवेनियाई स्पेनिश स्वाहिली स्वीडिश थाई तुर्की यूक्रेनी उर्दू वियतनामी वेल्श यहूदी बंगाली बोस्नियाई
सिबुआनो एस्पेरांतो गुजराती हौसा हमोंग ईग्बो जावानीस कन्नड़ खमेर लाओ लैटिन माओरी मराठी मंगोलियन नेपाली पंजाबी सोमाली तामिल तेलुगु योरूबा
ज़ुलु
Английский Французский Немецкий Итальянский Португальский Русский Испанский