【问题标题】:How to pause an NSThread until notified?如何暂停 NSThread 直到收到通知?
【发布时间】:2009-10-13 07:24:14
【问题描述】:

我有一个工作线程,我想做它的一部分任务,然后暂停并等待来自另一个线程的“ok,继续”命令,然后暂停并等待,等等。

用例是:控制对象是一个视图,我想显示有关工作线程内部正在发生的事情的信息,并允许我在工作线程中“单步”执行它。

我的工人中相当丑陋和笨拙的事情是:

NSLog(@"paused");
paused = YES;

while (paused)
{
    [NSThread sleepForTimeInterval:0.25];
}
NSLog(@".. continuing");

...但我不禁想到一定有更好的方法,可能涉及 NSLocks 或类似的。

评论、提示建议?

谢谢!

【问题讨论】:

    标签: cocoa nsthread


    【解决方案1】:

    查看线程指南中的NSConditionConditions 部分。代码如下所示:

    NSCondition* condition; // initialize and release this is your app requires.
    
    //Worker thread:
    while([NSThread currentThread] isCancelled] == NO)
    {
        [condition lock];
        while(partySuppliesAvailable == NO)
        {
            [condition wait];
        }
    
        // party!
    
        partySuppliesAvailable = NO;
        [condition unlock];
    }
    
    //Main thread:
    [condition lock];
    // Get party supplies
    partySuppliesAvailable = YES;
    [condition signal];
    [condition unlock];
    

    【讨论】:

    • 正是我需要的。谢谢。
    • 另请注意,对于未来的探险者:NSConditionLock,您可以在其中执行[condition lockWhenCondition: suppliesAvailable]; mySupplies = [supplyQueue contents]; [supplyQueue removeAllSupplies]; [condition unlockWithCondition: noSuppliesAvailable]; // spend mySupplies as desired 之类的操作,这是一个非常有用的模式。就我而言,而不是partySupplies,我将其作为需要处理的数据。 QED。
    • +1 让派对开始。 :D 很好地使用了partySuppliesAvailable 和 // 派对!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多