Отримання ідентифікатора потоку виклику поточного методу


122

Чи є спосіб роздрукувати поточний ідентифікатор потоку, на якому виконується поточний метод?

(об’єктивна-с будь-ласка)


3
nall відповів на питання, але не справжнє питання .... чому ти хочеш це знати? Крім налагодження або затвердження правильної поведінки, основний матеріал на currentThread це взагалі погана ідея.
bbum

Мені для одного потрібен був, щоб створити локальні об'єкти, що приєднуються до іншого об'єкта (тобто асоціюються з батьківським об'єктом, а потік - не тільки потоком).
адиб

Відповіді:


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

Яке значення name = (null), якщо нитка є основною, вона повертає NSThread: 0x60800006cb80> {number = 1, name = main}, чи означає "name = (null)" посилання на фонову нитку.
Нірмала Маурія

І як можна схопити це ім’я та цифру? 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
@ Rajneesh071 Дійсно, що ще ти очікував, відобразити ідентифікатор іншого потоку?
сенс має значення

Метод [NSThread currentThread]класу повертає об'єкт NSThread. Ви можете записати адресу цього об’єкта потоку, але як отримати числовий ідентифікатор потоку, як, наприклад, що відображається у відладчику Xcode? (Тема 1 для основної теми та збільшення кількості кожної додаткової теми, створеної вашим додатком.)
Duncan C

@Duncan: Це майже напевно особливість налагоджувача, а не ОС / час виконання.
Камерон




-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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.