Obtendo o ID do Encadeamento da Chamada de Método Atual

122

Existe uma maneira de imprimir o ID do segmento atual no qual o método atual está sendo executado?

(objetivo-c, por favor)

Alexi Groove
fonte
3
nall respondeu à pergunta, mas não a pergunta real .... por que você quer saber? Além de depurar ou afirmar o comportamento correto, o básico sobre o currentThread geralmente é uma má ideia.
Bb 24/10/09
Eu, pelo menos, precisava criar objetos thread-locais que estão anexados a outro objeto (isto é, associados a um objeto pai e thread - não apenas ao thread).
adib 15/12/10

Respostas:

227
NSLog(@"%@", [NSThread currentThread]);
nall
fonte
Qual é o significado de name = (null), se o thread for principal, ele retornará NSThread: 0x60800006cb80> {number = 1, name = main}, significa "name = (null)" refere-se ao thread de segundo plano.
Nirmala Maurya
E como se pega esse nome e número? nameretorna descrição vazia, mesmo para o principal e numberestá longe de ser encontrada
Hari Karam Singh
Rápido e num fio sujo:NSString *s = [NSString stringWithFormat:@"%@", [NSThread currentThread]]; int threadNum = -1; sscanf(s.UTF8String, "<NSThread: 0x%*12[0-9a-f]>{number = %d", &threadNum);
Hari Karam Singh
35
#include <pthread.h>
...
mach_port_t machTID = pthread_mach_thread_np(pthread_self());
NSLog(@"current thread: %x", machTID);
neoneye
fonte
4
@ Rajneesh071 De fato, o que mais você esperava, exibir o ID de um segmento diferente?
significado-importa
O [NSThread currentThread]método de classe retorna um objeto NSThread. Você pode registrar o endereço desse objeto de thread, mas como obter o ID numérico do thread, como o que é exibido no depurador do Xcode? (Thread 1 para o segmento principal, e um número crescente para cada segmento adicional que é criado pelo seu app.)
Duncan C
@ Duncan: Isso é quase certamente um recurso do depurador, não do sistema operacional / tempo de execução.
Cameron
25

No Swift 5

print("Current thread \(Thread.current)")
dimo hamdy
fonte
12

Na Swift

print("Current thread \(NSThread.currentThread())")
Glauco Neves
fonte
3

Na Swift4

print ("\ (Thread.current)")

Jason
fonte
-1

você pode hackear algo assim (isso é bonito, mas você pode ir em frente e dividir até obter o número):

+ (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;
}
Wiz
fonte