线程中的 NSRunloop

Posted

技术标签:

【中文标题】线程中的 NSRunloop【英文标题】:NSRunloop in Thread 【发布时间】:2013-08-16 11:49:04 【问题描述】:

我有问题

这里是代码

- (void)start
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];


- (void)nlog
    NSLog(@"cool");



- (void)main



    thread = [[NSThread alloc] initWithTarget:self selector:@selector(start) object:nil];

    [thread start];


    [self performSelector:@selector(nlog) onThread:thread withObject:nil waitUntilDone:NO];

当我打电话时

[self performSelector:@selector(nlog) onThread:thread withObject:nil waitUntilDone:NO];

线程将继续运行,稍后我可以在线程中做一些事情;

但是如果我不调用它,线程将立即退出,并且永远无法使用线程做任何事情,为什么?

【问题讨论】:

尝试 [self performSelector:@selector(start) onThread:thread withObject:nil waitUntilDone:NO];我认为您没有在正确的线程上启动该运行循环。 @sbarow 我认为运行循环确实从辅助线程开始,如果不是,则无论是否调用 nlog,该线程都不会运行 简单的检查方法是给你的线程一个名字 [thread setName:@"MyThread"];然后在 startnlog 中记录线程 NSLog("%@", [NSThread currentThread]); 【参考方案1】:

当你启动一个线程时,如果你没有在runloop中添加任何source,runloop会立即返回。然后线程就结束了。

退房:

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1

【讨论】:

【参考方案2】:

首先,我不认为你对使用线程有正确的想法:

thread = [[NSThread alloc] initWithTarget:self selector:@selector(start) object:nil];

[thread start];

不要重写 NSThread 的 'start' 方法,你应该重写 'main' 方法。

其次,如果你想在一个线程中创建run loop,应该有一个while循环,像这样:

while (condition)
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];

顺便说一句,关于 NSRunLoop 的更多详细用法请参考我的回答:Best way to make NSRunLoop wait for a flag to be set?

【讨论】:

如果你把runUntilDate:放在一个while循环中,你应该把[NSDate distantFuture]替换成[NSDate dateWithTimeIntervalSinceNow:1]这样的东西 由于有时runUntilDate: 可能不会返回,因为它仍在等待下一个输入源,因此添加限制日期以保证其返回。 @Richard 我认为你是对的,我认为只需[self performSelector:@selector(nlog) onThread:thread withObject:nil waitUntilDone:NO]; 做延迟时间以保证回报的工作

以上是关于线程中的 NSRunloop的主要内容,如果未能解决你的问题,请参考以下文章

线程池中的可运行与线程内和线程池中的可运行有啥区别

QT多线程问题:子线程中的变量如何传递给主线程?

Java中的线程--线程中的工具

Android 中的“子线程”解析

Java中的守护线程

引用 C# 中的主线程