2012-02-01 11 views
7

मैं डेल्फी 6 आईडीई में थ्रेड सूची विंडो में एक अच्छा उपयोगकर्ता के अनुकूल नाम दिखाना चाहता हूं। मुझे डेल्फी 6 में ऐसा करने के लिए वेब पर नीचे दिया गया कोड मिला है, जहां तक ​​मुझे पता है कि संस्करण में SetThreadName() को मूल रूप से कार्यान्वित नहीं किया गया है। मैं इसे अपने धागे की निष्पादन() विधि से बुलाता हूं। मुझे पता है कि इसे बुलाया जा रहा है क्योंकि अपवाद उठाए जाने पर आईडीई पॉप अप हो जाता है। हालांकि, जब मैं थ्रेड सूची (Ctrl + Alt + T) में देखता हूं, तो मुझे सेट नाम दिखाई नहीं देता है। मैं बस सामान्य थ्रेड आईडी, राज्य, स्थिति, और स्थान कॉलम देखता हूं, और कुछ नहीं।क्या डेल्फी 6 में धागे का नाम सेट करने का यह सही तरीका है?

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

Named threads in Delphi - what is that for?

procedure SetThreadName_delphi(const Name: string); 
    type 
     TThreadNameInfo = 
     record 
      RecType: LongWord; 
      Name: PChar; 
      ThreadID: LongWord; 
      Flags: LongWord; 
     end; 
var 
    info:TThreadNameInfo; 
begin 
    // This code is extremely strange, but it's the documented way of doing it! 

    info.RecType := $1000; 
    info.Name := PChar(Name); 
    info.ThreadID := $FFFFFFFF; 
    info.Flags := 0; 

    try 
     RaiseException($406D1388, 0, 
     SizeOf(info) div SizeOf(LongWord), PDWord(@info)); 
    except 
    end; 
end; 
+1

मेरा मानना ​​है कि धागा नाम केवल डेल्फी 2010 और उसके बाद में दिखाई देता है। – Nat

+0

नहीं, डी 6 के बाद थ्रेड नामकरण समर्थित है। –

+1

स्क्रैच कि - डेल्फी 7. –

उत्तर

6

मैं the original code

पाया है यह एक आवेदन विशेष अपवाद (यह विजुअल C++ संकलक के लिए विशिष्ट है इसका मतलब है कि) है। मुझे कोई कारण नहीं दिख रहा है कि डेल्फी को इस अजीब विशेषता का समर्थन क्यों करना चाहिए (हालांकि यह संभव है)।


संपादित: लेकिन यह काम करता है! (रेमी Lebeau के लिए धन्यवाद)

बस (डिबगर 'थ्रेड स्थिति' विंडो में मैं देख रहा हूँ 'वाह!') डेल्फी XE पर परीक्षण किया:

unit NameTest; 

interface 

uses 
    Windows, Classes; 

type 
    TTestThread = class(TThread) 
    private 
    { Private declarations } 
    protected 
    procedure Execute; override; 
    end; 

implementation 

{ TTestThread } 

procedure SetThreadName_delphi(const Name: string); 
    type 
     TThreadNameInfo = 
     record 
      RecType: LongWord; 
      Name: PAnsiChar; 
      ThreadID: LongWord; 
      Flags: LongWord; 
     end; 
var 
    info:TThreadNameInfo; 
    AnsiName: AnsiString; 

begin 
    AnsiName:= Name; 
    info.RecType := $1000; 
    info.Name := PAnsiChar(AnsiName); 
    info.ThreadID := $FFFFFFFF; 
    info.Flags := 0; 
    try 
     RaiseException($406D1388, 0, 
     SizeOf(info) div SizeOf(LongWord), PDWord(@info)); 
    except 
    end; 
end; 

procedure TTestThread.Execute; 
begin 
    SetThreadName_delphi('Wow!'); 
    while not Terminated do 
    Sleep(1000); 
end; 

end. 
+3

हाँ, यह करता है। थ्रेड नामकरण डी 6 में पेश किया गया था, और सटीक उसी अपवाद का उपयोग करता है जो विजुअल स्टूडियो करता है .. –

+1

यह उसी जादू अपवाद का उपयोग करता है ताकि डेल्फी डीबगर एमएसवीसी में कोडित डीएलएस में नामित धागे के नाम दिखा सके। –

+0

अजीब स्निपेट! – opc0de

5

सी ++ बिल्डर 6 और डेल्फी 7 के बाद में , File > New > Other > Thread Object विज़ार्ड में डीबगर में नए थ्रेड का नामकरण करने का विकल्प है। विज़ार्ड विधि के शीर्ष पर आवश्यक RaiseException() कार्यान्वयन के साथ TThread वंशज वर्ग को स्टब बनाता है।

हालांकि डेल्फी 6 के लिए यह कोई मदद नहीं है, जो अभी तक थ्रेड नामकरण का समर्थन नहीं करता है।

+0

मैंने अभी कोशिश की है और जेनरेट निष्पादन() विधि में एकमात्र चीज टिप्पणी थी "यहां थ्रेड कोड रखें"। –

+0

इसके अलावा, मैंने बस सर्ग के कोड की कोशिश की, जो केवल पीसीहर (नाम) के बजाय पेंसिहर (AnsiName) के उपयोग द्वारा पोस्ट किए गए स्निपेट से अलग दिखता है, और मैं अभी भी थ्रेड नाम नहीं देखता हूं (डेल्फी 6) । –

+0

स्पष्ट रूप से इसे डेल्फी 7 तक लागू नहीं किया गया था, क्षमा करें। –

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