2010-10-05 12 views
6

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

{$IFDEF MSWINDOWS} 
type 
    TThreadNameInfo = record 
    FType: LongWord;  // must be 0x1000 
    FName: PChar;  // pointer to name (in user address space) 
    FThreadID: LongWord; // thread ID (-1 indicates caller thread) 
    FFlags: LongWord; // reserved for future use, must be zero 
    end; 
{$ENDIF} 

{ TTestThread } 

procedure TTestThread.SetName; 
{$IFDEF MSWINDOWS} 
var 
    ThreadNameInfo: TThreadNameInfo; 
{$ENDIF} 
begin 
{$IFDEF MSWINDOWS} 
    ThreadNameInfo.FType := $1000; 
    ThreadNameInfo.FName := 'ThreadName'; 
    ThreadNameInfo.FThreadID := $FFFFFFFF; 
    ThreadNameInfo.FFlags := 0; 

    try 
    RaiseException($406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo); 
    except 
    end; 
{$ENDIF} 
end; 

मैं यह वास्तव में उपयोगी पाते हैं डिबगिंग आप नहीं देख सकते हैं के लिए के दौरान केवल टीआईडी, लेकिन थ्रेड नाम भी इस तरह से असाइन किए गए हैं। आप जानते हैं कि कौन सा धागा है जिसके लिए धन्यवाद।

कृपया मुझे बताएं, हालांकि, अगर नाम दिया गया नाम किसी भी तरह से पहुंचा जा सकता है। क्या इसे थ्रेड के हैंडल के आधार पर पढ़ा जा सकता है? या इसे किसी अन्य प्रक्रिया द्वारा प्रक्रिया के बाहर 'बाहर' भी पढ़ा जा सकता है? आप जानते हैं, ऐसे अनुप्रयोग हैं जो आपकी प्रक्रियाओं और उनमें काम कर रहे धागे सूचीबद्ध करते हैं। क्या यह नाम इस तरह के ऐप्स के लिए सुलभ होगा?

धन्यवाद!

+0

डीबगर में थ्रेड नाम WHILE को सेट करने के लिए किसी को भी खोजने के लिए, यह docwiki विषय में मदद करनी चाहिए: मैन्युअल रूप से: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Naming_a_Thread_While_Debugging कोड में: http://docwiki.embarcadero.com/Libraries/Seattle/en/System.Classes.TThread.NameThreadForDebugging –

उत्तर

9

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

+0

स्पष्ट स्पष्टीकरण के लिए धन्यवाद। तो धागे को नाम सौंपने का दूसरा तरीका है ताकि मैं इसे बाहर से देख सकूं? मुझे लगता है कि नहीं है, लेकिन मैं बस सुनिश्चित करना चाहता हूँ :)। धन्यवाद –

+0

दरअसल, धागे नामहीन हैं। लेकिन उन्हें एक नाम असाइन करने के लिए, प्रति तत्व दो मानों के साथ गतिशील सरणी का उपयोग करें: आईडी के लिए एक, नाम के लिए एक। .NET में, एक शब्दकोश कक्षा है। डेल्फी में, आपको कुछ ऐसा ही लिखना होगा। –

+0

फिर फिर, वह 'डिक्शनरी' जिसे आप लिखना चाहते हैं, उसे बाहर से किसी भी तरह से कॉल करने योग्य होना चाहिए। यह एक आसान काम नहीं है, हालांकि यह तकनीकी रूप से संभव है। प्रश्न यह है कि, यह आपके कोड में शामिल करने के लिए पर्याप्त मूल्यवान विशेषता है? –

6

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

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