2013-06-21 2 views
7

나는 내 맥을위한 목표 c에서 나 자신을 위해 간단한 타이머 프로그램을 작성 중이다. 타이머가 제대로 카운트 다운하지만, 나는 죽음의 바람개비가 나옵니다. 바람막이가 어떻게 사라지나요? 나는 무한 루프가 있기 때문에 그것을 생각한다. 그러나 그것을 우회하는 것은 어딘가에 있어야한다.무한 루프에서 죽음의 바람개비 중단 목표 C

버튼 클릭으로 트리거되는 IBAction이 있습니다 (버튼이 시작됨). 그리고 거기에서, 그것은 작업을 수행하는 다른 함수를 호출합니다. 여기

내 IBAction를하다 :

- (IBAction)timerStart:(id)sender { 
    self.timerDidPause = NO; 
    [self timerRunning]; 
} 

그리고 여기 timerRunning입니다 : 함수 formatTimerLabel이 그래서 여기라는입니다이 함수에서

- (void)timerRunning { 
for (;;) { 
    usleep(1000000); 
    if (self.timerDidPause == YES) { 

    } 
    else { 
     if (self.seconds == 0) { 
      if (self.minutes == 0) { 
       [self timerDone]; 
       break; 
      } 
      else { 
       self.seconds = 59; 
       self.minutes = self.minutes - 1; 
       [self formatTimerLabel:self.hours :self.minutes :self.seconds]; 
      } 
     } 
     else { 
      self.seconds = self.seconds - 1; 
      [self formatTimerLabel:self.hours :self.minutes :self.seconds]; 
     } 
    } 
} 
} 

그 :

- (void)formatTimerLabel:(int)hours 
        :(int)minutes 
        :(int)seconds { 
NSString *minuteString = [[NSString alloc] init]; 
NSString *secondString = [[NSString alloc] init]; 
if (minutes < 10) { 
    minuteString = [NSString stringWithFormat:@"0%d", minutes]; 
} 
else { 
    minuteString = [NSString stringWithFormat:@"%d", minutes]; 
} 
if (seconds < 10) { 
    secondString = [NSString stringWithFormat:@"0%d", seconds]; 
} 
else { 
    secondString = [NSString stringWithFormat:@"%d", seconds]; 
} 
[self.timerLabel setStringValue:[NSString stringWithFormat:@"%d:%@:%@", hours, minuteString, secondString]]; 
[self.timerLabel display]; 
} 
+0

이 코드에서 'UIActivityIndicator'(핀 휠)이 들어 왔습니까? – Garrett

+0

디버거에서 PAUSE 버튼을 눌러 코드가 실행되는 곳을 확인하십시오. –

+2

그래, UI 스레드에서 절대로 절대로 안된다. –

답변

7

당신 UI 스레드가 루프에 걸리게됩니다. 몇 초 후에 OS는 커서를 바람개비로 전환합니다.

UI 스레드 외부에서 실행되도록 타이머를 예약하려면 NSTimerTimer Programming Guide을 조사해야합니다.

+1

풍차가없는 덕분에 감사합니다. – jamespick

관련 문제