2009-09-28 11 views
5

में कोई 'NameThreadForDebugging' तक कैसे पहुंचता है डेल्फी 2010 में डेल्फी थ्रेड में 'NameThreadForDebugging' को मैं कैसे एक्सेस करूं?डेल्फी 2010

type 
    TMyThread = class(TThread) 
    protected 
    procedure Execute; override; 
    procedure UpdateCaption; 
    end; 

implementation 

procedure TMyThread.UpdateCaption; 
begin 
    Form1.Caption := 'Name Thread For Debugging'; 
    // how I get 'TestThread1' displayed in the caption 
end; 


procedure TMyThread.Execute; 
begin 
    NameThreadForDebugging('TestThread1'); 
    Synchronize(UpdateCaption); 
    Sleep(5000); 
end; 

उत्तर

13

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

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

हालांकि डेटा स्थानांतरण एक तरफा है। एप्लिकेशन अपवाद के माध्यम से डीबगर को जानकारी भेज सकता है, लेकिन डीबगर डेटा वापस नहीं भेज सकता है। और ओएस सब कुछ के लिए अनजान है। ओएस के लिए, यह किसी भी अन्य अपवाद की तरह है।

+3

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

+0

क्रिस हेसिक द्वारा यह ब्लॉग एंट्री भी देखें: http://blogs.embarcadero.com/chrishesik/2009/10/22/34895 –

+0

उस ब्लॉग को लेखक द्वारा हटा दिया गया, लेकिन लेख अभी भी http: // वेब पर है। archive.org/web/20101214193506/http://blogs.embarcadero.com/chrishesik/2009/10/22/34895 यह SO प्रश्न भी देखें: http://stackoverflow.com/questions/3864306/named-threads-in -delphi-what-is-that- –

-2

AFAICS डेल्फी केवल नाम का समर्थन करता है। नाम पाने के लिए आपको कुछ विंडोज एपीआई फ़ंक्शन कॉल करना होगा।

+0

-1 क्योंकि डेल्फी केवल आईडीई धागा नाम का समर्थन करता है कि नहीं है, और क्योंकि थ्रेड नाम पुनर्प्राप्त करने के लिए कोई एपीआई नहीं है (.NET में उम्मीद है) क्योंकि एपीआई परत पर थ्रेड नाम उपलब्ध नहीं हैं। –

0

कोड केंद्रीय उदाहरण ID: 21893, Named Pipes पर इकाई डीबग थ्रेड समर्थन, दिखाता है कि डेल्फी के पुराने संस्करणों में थ्रेड नाम कैसे सेट करें।

+0

के लिए जो आपने यहां लिखा है वह सत्य है, लेकिन यह वास्तव में प्रश्न का उत्तर नहीं देता है। साथ ही, आपके द्वारा लिंक किया गया कोड थ्रेड नाम देने का एक तरीका प्रदान करता है, लेकिन यह अंतर्निहित वीसीएल कोड की तरह, नाम लाने के लिए एक तरीका प्रदान नहीं करता है। –

2

आप क्या पूछते हैं, जहां आप इसे उपयोग कर सकते हैं आप अपने धागा वर्ग के अंदर नाम स्टोर करने के लिए की जरूरत है, ऐसा करने के लिए उदाहरण के लिए:

type 
    TMyThread = class(TThread) 
    protected 
    FName: String; 
    procedure Execute; override; 
    procedure UpdateCaption; 
    end; 

procedure TMyThread.UpdateCaption; 
begin 
    Form1.Caption := FName; 
end; 

procedure TMyThread.Execute; 
begin 
    FName := 'TestThread1'; 
  NameThreadForDebugging(FName); 
  Synchronize(UpdateCaption); 
  Sleep(5000); 
end; 
संबंधित मुद्दे