title: NSTimer never starts
body: <p>I'm just trying to close an NSPanel after a couple second delay, but I can't get my NSTimer to start. It will fire if I explicitly call the fire method on it, but it will never go by itself. Here's my code:</p>
  
  <pre><code>   - (void)startRemoveProgressTimer:(NSNotification *)notification {
      NSLog(@"timer should start");
      timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(removeProgress:) userInfo:nil repeats:NO];
  }
  
  - (void)removeProgress:(NSTimer *)timer {
      [progressPanel close];
  }
  </code></pre>
  
  <p>I do have some threading in my code as such. I assume this is what's messing my timer up. </p>
  
  <pre><code>-(void)incomingTextUpdateThread:(NSThread*)parentThread {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  
  //mark the thread as running
  readThreadRunning = TRUE;
  
  const int BUFFER_SIZE = 100;
  char byte_buffer[BUFFER_SIZE]; //buffer for holding incoming data
  int numBytes = 0; //number of bytes read
  NSString *text; //incoming text from the serial port
  
  [NSThread setThreadPriority:1.0];
  
  //this will loop until the serial port closes
  while (TRUE) {
      //read() blocks until some data is available or the port is closed
      numBytes = read(serialFileDescriptor, byte_buffer, BUFFER_SIZE);
      if(numBytes &gt; 0) {
          //creat a string from the incoming bytes
          text = [[[NSString alloc] initWithBytes:byte_buffer length:numBytes encoding:[NSString defaultCStringEncoding]] autorelease];
          if(!([text rangeOfString:SEND_NEXT_COORDINATE].location == NSNotFound)) {
              //look for &lt;next&gt; to see if the next data should be sent
              if(coordinateNum &lt;[coordinatesArray count]) {
                  [self sendNextCoordinate]; //send coordinates
              }
              else {
                  [self writeString:FINISH_COORDINATES_TRANSMIT]; //send &lt;end&gt; to mark transmission as complete
                  NSNumber *total = [NSNumber numberWithUnsignedInteger:[coordinatesArray count]];
                  NSDictionary *userInfo = [NSDictionary dictionaryWithObject:total forKey:@"progress"];
                  [[NSNotificationCenter defaultCenter] postNotificationName:@"uploadProgressChange" object:self userInfo:userInfo]; //update progress bar to completed
              }
  
  
          }
  
          [self performSelectorOnMainThread:@selector(appendToIncomingText:) withObject:text waitUntilDone:YES]; //write incoming text to NSTextView
      } else {
          break; //Stop the thread if there is an error
      }
  }
  
  // make sure the serial port is closed
  if (serialFileDescriptor != -1) {
      close(serialFileDescriptor);
      serialFileDescriptor = -1;
  }
  
  // mark that the thread has quit
  readThreadRunning = FALSE;
  
  // give back the pool
  [pool release];
  }
  </code></pre>
  
  <p>Which is called from another method by: <code>[self performSelectorInBackground:@selector(incomingTextUpdateThread:) withObject:[NSThread currentThread]];
  </code></p>