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


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.