Iphone 如何只让一根线睡觉?

Iphone 如何只让一根线睡觉?,iphone,cocoa-touch,multithreading,Iphone,Cocoa Touch,Multithreading,我想在我的游戏中创建两个线程。一个线程用于计时器,另一个线程用于触摸事件。因为当我在iPhone上运行游戏时,计时器与触摸事件冲突,触摸事件不会被报告。它在模拟器中运行平稳,但在iPhone或iPodtouch上运行非常缓慢。所以我对触摸事件和计时器使用单独的线程 当我使用[NSThread sleepForTimeInterval:0.01]时,它使所有线程都处于睡眠状态。我的意思是触摸活动也会停止。我只想停止计时器线程 这是我的代码: -(void)touchesBegan:(NSSet *

我想在我的游戏中创建两个线程。一个线程用于计时器,另一个线程用于触摸事件。因为当我在iPhone上运行游戏时,计时器与触摸事件冲突,触摸事件不会被报告。它在模拟器中运行平稳,但在iPhone或iPodtouch上运行非常缓慢。所以我对触摸事件和计时器使用单独的线程

当我使用
[NSThread sleepForTimeInterval:0.01]
时,它使所有线程都处于睡眠状态。我的意思是触摸活动也会停止。我只想停止计时器线程

这是我的代码:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    BOOL Done = NO;
    while (!Done)
    {
        NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
        [NSThread sleepForTimeInterval:0.01];
        [self performSelectorOnMainThread:@selector(callTapCode) withObject:tapView waitUntilDone:YES];

        //performSelectorOnMainThread:@selector(callTapCode) withObject:nil waitUntilDone:YES];

        [loopPool release];
        Done=YES;
    }

    [pool drain];
}

如果您试图创建一个计时器,您可能应该只使用
NSTimer
,因为这比创建一个线程只是为了每隔一段时间发送一个“go”事件更简单、更高效


编辑:按原样,您不是在创建第二个线程,而是通过在循环中调用[NSThread sleepForTimeInterval:0.01]来暂停主线程。这意味着您的主线程不再运行事件循环,这可能会导致各种事情不再工作。

[[nsrunlop currentlunloop]runUntilDate:[NSDate datewithtimeintervalencesinew:0.01]

现在我的游戏在itouch上运行得很顺利,有了线程的概念,但在iphone上,它仍然会产生问题,无法及时检测计时器的触摸。我不知道为什么这个问题只出现在iphone上你还在使用0.01的定时器吗?您应该在更新之间留出更多的时间,因为人眼无法看到超过60Hz的频率。新款iPodtouch可以工作,而iPhone不能工作的原因是它有更快的CPU。在iPhone上,计时器事件的生成速度要快于它们的消耗速度。我的游戏完全依赖于触摸事件,如果它因为计时器而无法被检测到,那么它就没有用了。所以我使用了AD的概念而不是定时器,但iphone仍然存在一些问题。我试了里面的所有东西。如果您有其他解决方案,请告诉我,如果您计划每1/100秒运行一个过程,并且运行所需的时间比这长,计划的事件将在事件队列中累积,不会为其他事件(包括触摸事件)留下任何空间。无论您是通过NSTimer还是通过PerformSelect或OnMainThread计划这些事件,您都会遇到相同的问题。