(iphone)如何在这里正确设置runloop?许多问题

时间:2011-01-14 09:18:23

标签: iphone multithreading runloop

我刚刚开始阅读apple的线程编程指南 我正在开始一个帖子,并引用它

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

并且threadMain看起来像doc中的示例代码 我需要在主线程的代码中更改“exitNow”变量来终止此线程,但不知道如何。
myThreadMain循环在没有执行任何工作时需要休眠,但也不知道如何实现它。
如果新线程不会立即死亡,那么doc说我需要至少一个输入源,但是新线程只需要接收“exit now message”和performSelector:onThread:call。
我应该设置输入源吗?

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

    BOOL exitNow = NO;
    NSRunLoop* runLoop = [NSRunLoop currentRunLoop];

    // Add the exitNow BOOL to the thread dictionary.                                                                                                                                                                                                                         
    NSMutableDictionary* threadDict = [[NSThread currentThread] threadDictionary];
    [threadDict setValue:[NSNumber numberWithBool:exitNow] forKey:@"ThreadShouldExitNow"];

    // Install an input source.                                                                                                                                                                                                                                               
//  [self myInstallCustomInputSource];                                                                                                                                                                                                                                        

    while (!exitNow)
    {
        // Do one chunk of a larger body of work here.                                                                                                                                                                                                            

        // Run the run loop but timeout immediately if the input source isn't waiting to fire.                                                                                                                                                                                
        [runLoop runUntilDate:[NSDate date]];

        // Check to see if an input source handler changed the exitNow value.                                                                                                                                                                                                 
        exitNow = [[threadDict valueForKey:@"ThreadShouldExitNow"] boolValue];
    }

    [pool release];
}

我将通过

将一些工作交给这个帖子
performSelector:onThread:withObject: 

要执行的选择器需要定义如下,
但也不知道如何实现这一点。

- (void) selectorToPerformInThread
{
  for( int i = 0; i < 10; ++i )
  {
   do something;
   **if(received a new "selectorToPerformInThread" call 
      when we are still in this loop)
          break out and let the new "selectorToPerformInThread" 
          in order to run from the beginning of loop** 
      }
    }

这是很多问题...... 让我重申一下我的问题。

  1. 如何设置存储在threadDict中的“exitNow”变量。
  2. 如何设置线程以便在没有工作时(当它不执行选择器时)休眠。
  3. 我应该设置输入源,以便线程不会立即死亡吗?
  4. 如何设置运行循环,以便每次调用“performSelector”时,相同的选择器(如果它正在执行)被取消,并从头开始运行?
  5. 提前致谢。

1 个答案:

答案 0 :(得分:0)

1 /通过引用传递exitNow变量并在threadDict中设置它或传递包含变量的对象并设置obj.exitNow = YES;

2 /当线程完成其工作时,让它死掉。你需要一个新的线程,只需开始一个新的

3 /我不明白你的想法,对不起

4 /我认为你需要一个单例obj,然后在该对象中设置变量,以便线程退出,然后启动一个新线程并调用选择器