【问题标题】:How to stop a NSThread sub-thread in iphone如何在 iphone 中停止 NSThread 子线程
【发布时间】:2010-07-07 01:41:36
【问题描述】:

我在主线程中使用 NSThread 创建了一个子线程

NSThread *newThread = [[NSThread alloc] initWithTarget:self selector:@selector(MyThread:) object:timer];

5 秒后,我在主线程中使用了 [newThread cancel] 来停止子线程,但它不起作用,

MyThread 方法:在 newThread 中仍在工作

那么,停止 newThread 的正确答案是什么,THX

实际上 [newThread isCancelled] 是 YES,但选择器 MyThread 仍在工作

【问题讨论】:

    标签: iphone objective-c nsthread


    【解决方案1】:

    cancel 方法仅通知线程它已被取消(正如您提到的将 isCancelled 更改为 YES。然后由线程本身负责检查并退出。例如,在您的 @ 987654324@ 方法你可以这样做:

    // At some checkpoint
    if([[NSThread currentThread] isCancelled]) {
        /* do some clean up here */
        [NSThread exit];
    }
    

    您应该定期进行此检查,并如图所示从线程内退出;否则cancel 没有任何作用。

    【讨论】:

    • 你的意思是一个线程只能被自己取消,不能被另一个线程或主线程取消?
    • @None:这意味着“取消”线程并没有按照您的想法进行。当你取消一个线程时,它会导致isCancelled 返回YES。然后线程应该停止执行。不过,它不会强制线程立即停止执行——如果它有任何资源打开,那会很麻烦。
    • @Chuck:谢谢,但是如果我想在主线程中停止一个子线程,我应该怎么做?
    • 实际上,你不能。无法知道线程在被杀死时处于什么状态,因此,除了isCancelled 机制之外,无法安全地从另一个线程中杀死一个线程。
    【解决方案2】:

    -(void)取消

    讨论 此方法的语义与用于 NSOperation 对象的语义相同。此方法在接收器中设置状态信息,然后由 isCancelled 方法反映。 支持取消的线程应定期调用 isCancelled 方法来确定线程是否实际上已被取消,如果已取消则退出。

    更多信息见NSThread API Reference

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 2010-12-27
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多