Как мне создать несколько потоков в одном классе? - PullRequest
1 голос
/ 24 декабря 2009

все! Я хочу создать несколько потоков в моем приложении. Я использую следующий код для создания потока. Это метод buttonPress, где я создаю поток:

- (void) threadButtonPressed:(UIButton *)sender {

threadStartButton.hidden = YES;

    threadValueLabel.text = @"0";
threadProgressView.progress = 0.0;

  [NSThread detachNewThreadSelector:@selector(startMethod) toTarget:self withObject:nil];

}

Это 'где я вызываю метод для потока:

- (void)startMethod {

  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  [self performSelectorOnMainThread:@selector(threadMethod) withObject:nil waitUntilDone:NO];

  [pool release];

}

 - (void)threadMethod {

float actual = [threadProgressView progress];

    threadValueLabel.text = [NSString stringWithFormat:@"%.2f", actual];
if (actual < 1) {

    threadProgressView.progress = actual + 0.01;
    [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(makeMyProgressBarMoving) userInfo:nil repeats:NO];
}

    else 
    threadStartButton.hidden = NO;  
 }

Эта тема работает правильно. Но когда я пытаюсь создать другой поток в том же классе, используя тот же метод, он создается правильно, но в методе "executeSelectorOnMainThread" он не выполняет этот метод. Кто-нибудь может мне помочь?

Ответы [ 3 ]

0 голосов
/ 02 января 2010

Кажется, вы пытаетесь поставить в очередь методы, которые будут выполняться в главном потоке. Возможно, вы захотите взглянуть на объекты NSOperationQueue и NSOperation. Если вы хотите продолжить этот путь, вы можете изменить параметр repeats на YES. Кажется, проблема в том, что основной поток занят, когда ему передают это сообщение. Это приведет к блокировке основного потока. Вы также можете не использовать второй threadMethod и не перезванивать главному потоку, а вместо этого поместить содержимое threadMethod в блок @synchronized(self). Таким образом, вы получаете преимущества многопоточности (одновременное выполнение нескольких частей кода и, следовательно, реактивный пользовательский интерфейс) без каких-либо странностей с основным потоком.

0 голосов
/ 04 января 2010

Почему вы не можете сделать это одним и тем же вызовом, заменив

     -(void)startMethod {

      NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

      [self performSelectorOnMainThread:@selector(threadMethod) withObject:nil waitUntilDone:NO];

      [pool release];

}

с

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


  float actual = [threadProgressView progress];

  threadValueLabel.text = [NSString stringWithFormat:@"%.2f", actual];

  if (actual < 1) {

  threadProgressView.progress = actual + 0.01;
  [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(makeMyProgressBarMoving) userInfo:nil repeats:NO];

  }

  else 
  threadStartButton.hidden = NO;

  }

  [pool release];

}

0 голосов
/ 24 декабря 2009

Мне не хватает контекста здесь. Я вижу вызов, который создает новый поток, а затем я вижу вызов, который выполняет селектор (вызывает метод) в основном потоке ..

Как я понимаю, вы вызываете функцию в новом потоке (entryMethod), в котором вы вызываете метод для выполнения в основном потоке (myMethod). Я не понимаю смысла этого, без некоторой справочной информации и, возможно, некоторого кода.

Возможно ли, что основной поток занят выполнением функции myMethod и, следовательно, не отвечает на другие вызовы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...