वर्तमान विधि कॉल की थ्रेड आईडी प्राप्त करना


122

क्या वर्तमान थ्रेड आईडी पर प्रिंट करने का कोई तरीका है जिस पर वर्तमान विधि निष्पादित हो रही है?

(उद्देश्य-सी कृपया)


3
nall सवाल का जवाब दिया, लेकिन असली सवाल नहीं .... आप क्यों जानना चाहते हैं? डिबगिंग से परे या सही व्यवहार का दावा करते हुए, वर्तमान ट्रेड पर मूल सामान आमतौर पर एक बुरा विचार है।
bbum

मुझे एक के लिए यह आवश्यक था कि वे थ्रेड-लोकल ऑब्जेक्ट्स बनाएँ जो किसी अन्य ऑब्जेक्ट से जुड़े हों (यानी पैरेंट ऑब्जेक्ट और थ्रेड से जुड़े हों - न कि सिर्फ थ्रेड)।
adib

जवाबों:


228
NSLog(@"%@", [NSThread currentThread]);

नाम = का अर्थ क्या है (शून्य), यदि धागा मुख्य है तो यह NSThread लौटाता है: 0x60800006cb80> {संख्या = 1, नाम = मुख्य}, इसका मतलब है "नाम = (नल)" पृष्ठभूमि धागे को संदर्भित करता है।
निर्मला मौर्य

और कोई उस नाम और संख्या को कैसे पकड़ता है? nameमुख्य के लिए भी खाली विवरण देता है और numberकहीं नहीं पाया जाता है
हरि करम सिंह

त्वरित और गंदा धागा संख्या:NSString *s = [NSString stringWithFormat:@"%@", [NSThread currentThread]]; int threadNum = -1; sscanf(s.UTF8String, "<NSThread: 0x%*12[0-9a-f]>{number = %d", &threadNum);
हरि करम सिंह १ '

35
#include <pthread.h>
...
mach_port_t machTID = pthread_mach_thread_np(pthread_self());
NSLog(@"current thread: %x", machTID);

4
@ रजनीश071 वास्तव में, आपको और क्या उम्मीद थी, एक अलग धागे की आईडी प्रदर्शित करें?
अर्थ-मामले

[NSThread currentThread]वर्ग विधि एक NSThread वस्तु देता है। आप उस थ्रेड ऑब्जेक्ट का पता लॉग कर सकते हैं, लेकिन आपको संख्यात्मक थ्रेड आईडी कैसे मिलती है, जैसे कि Xcode डिबगर में क्या प्रदर्शित होता है? (मुख्य थ्रेड के लिए थ्रेड 1, और आपके ऐप द्वारा बनाए गए प्रत्येक अतिरिक्त थ्रेड के लिए संख्या बढ़ाना।)
डंकन सी

@ डंकन: यह लगभग निश्चित रूप से डीबगर की एक विशेषता है, न कि ओएस / रनटाइम।
कैमरन




-1

आप इस तरह से कुछ हैक कर सकते हैं (यह बहुत सुंदर प्रिंट करता है, लेकिन आप आगे बढ़ सकते हैं और जब तक आप नंबर नहीं पाते हैं):

+ (NSString *)getPrettyCurrentThreadDescription {
    NSString *raw = [NSString stringWithFormat:@"%@", [NSThread currentThread]];

    NSArray *firstSplit = [raw componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"{"]];
    if ([firstSplit count] > 1) {
        NSArray *secondSplit     = [firstSplit[1] componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"}"]];
        if ([secondSplit count] > 0) {
            NSString *numberAndName = secondSplit[0];
            return numberAndName;
        }
    }

    return raw;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.