iphone - Objective-C run loop停止和重启的方法?

标签 iphone objective-c multithreading

我曾经认为我是一个相当聪明的人。
苹果的《线程编程指南》,粉碎了我自负的 self 欺骗。

我有一个方法我想在辅助线程上重复运行,在下面的例子中我称之为 doStuff:
我希望能够重复停止和开始重复调用此方法。

代码启动线程。
如果 bool 值 stuffToDo 为真,
然后它调用 doStuff:
否则
它有一点休息。
然后它再次循环直到我告诉它停止

我当前的代码看起来很浪费,因为即使无事可做,它也会一直检查“stuffToDo”。

我可以摆脱 stuffToDo 并根据需要生成和取消线程。
这似乎也很浪费,并且意味着我需要小心不要在我已经运行一个线程时意外生成一个新线程。

我确信可以在 Apple 的“线程编程指南”的“运行循环管理”部分的某个地方找到有效解决我的困境的答案
也许它涉及自定义输入源

但我真的觉得这份文件很有挑战性。
就好像这份文件在我的大脑中产生了太多线程,计算逐渐停止。

enum eRenderThreadMode
{
    render_not_started,
    render_run,
    render_cancel,
    render_finished
};


- (IBAction) startThread:(id)sender
{
    self.renderThreadMode = render_run;
    label.text = @"doing stuff"; 
    [NSThread detachNewThreadSelector:@selector(keepDoingStuff)  toTarget:self withObject:nil];

}

- (void)keepDoingStuff
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    while (renderThreadMode == render_run) 
    {
        if(stuffToDo)
        {
            [self doStuff];
        }
        else
        {
            [NSThread sleepForTimeInterval:kLittleRest];
        }
    }
    self.renderThreadMode = render_finished;
    [pool release];
}


- (IBAction)stopThread:(id)sender
{
    self.renderThreadMode = render_stop;

    while (self.renderThreadMode == render_cancel) 
    {
        [NSThread sleepForTimeInterval:kLittleRest];
    }
}

最佳答案

您可以使用辅助线程休眠的同步对象。 This Apple page表示有一个名为 Conditions 的工具可以执行您想要的操作。使用 Condition 或类似的同步对象将使您的线程仅在有工作要做时(或线程结束时)被唤醒。

关于iphone - Objective-C run loop停止和重启的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1146648/

相关文章:

ios - 在 UITabBarController 中选择不同的选项卡时如何添加不同颜色的下划线

ios - 选择行其他部分在 UITableview 中包含相同的值?

objective-c - Eventkit 无法访问日历

ios - 当新的 iOS 应用程序安装 iphone 时收到通知

iphone - 从 CATransform3D 获取 'scale'

iphone - 我们如何找到由纬度或经度定义的两个位置之间的角度

ios - 如何在Restkit中映射自定义错误键?

python - 引用继承的类函数

c++ - 在多线程游戏中每帧都创建新的工作线程不好吗?

c++ - 线程和进程 ID 是否唯一?