Если вы строите для Snow Leopard, самым простым решением, на мой взгляд, является использование блоков и Grand Central Dispatch.
Следующий код показывает, как будет выглядеть ваш метод startIt:
при использовании GCD.
Ваш метод stopIt:
должен работать так, как вы его написали. Причина, по которой он не работал раньше, заключается в том, что события мыши происходят в главном потоке, и, таким образом, кнопка не отвечает вам, потому что вы выполняете работу в основном потоке. Эта проблема должна была быть решена сейчас, так как теперь работа над GCD была перенесена в другой поток. Попробуйте код, и если он не работает, дайте мне знать, и я посмотрю, не допустил ли я в нем ошибки.
// This method runs when a start button is clicked.
- (IBAction)startIt:(id)sender {
//Create the block that we wish to run on a different thread.
void (^progressBlock)(void);
progressBlock = ^{
[progressbar setDoubleValue:0.0];
[progressbar startAnimation:sender];
running = YES; // this is a instance variable
int i = 0;
while (running) {
if (i++ >= processAmount) { // processAmount is something like 1000000
running = NO;
continue;
}
// Update progress bar
double progr = (double)i / (double)processAmount;
NSLog(@"progr: %f", progr); // Logs values between 0.0 and 1.0
//NOTE: It is important to let all UI updates occur on the main thread,
//so we put the following UI updates on the main queue.
dispatch_async(dispatch_get_main_queue(), ^{
[progressbar setDoubleValue:progr];
[progressbar setNeedsDisplay:YES];
});
// Do some more hard work here...
}
}; //end of progressBlock
//Finally, run the block on a different thread.
dispatch_queue_t queue = dispatch_get_global_queue(0,0);
dispatch_async(queue,progressBlock);
}