2009-12-24 2 views
1

все! Я хочу создать несколько потоков в моем приложении. Я использую следующий код для создания потока. Этот метод 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; 
} 

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

+0

Можете ли вы описать, что вы пытаетесь сделать? Похоже, вы пытаетесь запустить метод на основном потоке из отдельных потоков, что, по-вашему, поражает цель многопоточности, не так ли? Есть причина для этого, но из вашего вопроса неясно, что вы действительно пытаетесь сделать, поэтому, пожалуйста, предоставьте нам немного больше информации, чтобы мы могли помочь. –

+0

Pleasw проверить мой отредактированный вопрос! – neha

+0

Пожалуйста, дайте мне знать, если я делаю что-то лишнее. Потому что я пробую это в первый раз. – neha

ответ

0

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

+0

Thanx RC Howe ... Это помогло! – neha

0

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

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

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

+0

Пожалуйста, проверьте мой отредактированный вопрос! – neha

0

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

 -(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

Поскольку я новичок в потоковом представлении, я думал, что необходимо указать performSelectorOnMainThread. Это не? – neha

+0

, указав, что ваш код возвращается к основному потоку, поэтому я думаю, что вы не сможете получить все преимущества потоковой передачи таким образом. – Nithin

Смежные вопросы