Потоки в Objective C - PullRequest
       2

Потоки в Objective C

1 голос
/ 23 мая 2011

Я новичок в Objective-C, и я пробовал пример программы в Threads из книги "Learn Objective-C для разработчиков Java".Я получаю 6 ошибок в определении функции.Это с ошибками.Есть ли ссылка, которая дает хороший пример многопоточности для начинающих, как я.

Thread2.m

#import <Foundation/Foundation.h>
#import "Process.h"

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Process* process = [Process new];
    NSProgressIndicator* indicator = [NSProgressIndicator new];
    Heartbeat* heartbeat = [Heartbeat startHeartbeatProcess:process withIndicator:indicator];
    [heartbeat stop];
    [pool drain];
    return 0;
}

Process.h

#import <Foundation/Foundation.h>

@interface Process : NSObject {

}
@property double progress;
@end

@interface NSProgressIndicator : NSObject {

}

@end


@interface Heartbeat : NSObject {

    @public
    NSThread* thread;
    NSProgressIndicator* indicator;
    Process* monitor;
}

+(Heartbeat*)startHeartbeatProcess:(id)process withIndicator:(NSProgressIndicator*)progress;
-(void)stop;
-(void)heartbeatThread:(id)ignored;
-(void)updateIndicator;

@end

Process.m

#import "Process.h"

@implementation Process

+(Heartbeat*)startHeartbeatProcess:(id)process withIndicator:(NSProgressIndicator*)progress {

    Heartbeat* heartbeat = [Heartbeat new];
    heartbeat->monitor = process;
    heartbeat->indicator = progress;
    heartbeat->thread = [[NSThread alloc]initWithTarget:heartbeat selector:(heartbeatThread:) object:nil]; //'heartbeatThread' undeclared
    [heartbeat->thread start];

    return heartbeat;
}

-(void)stop {

    [thread cancel]; //thread undeclared
}

-(void)heartbeatThread:(id)ignored {

    while (![thread isCancelled]) { 
        //thread undeclared
        [self performSelectorOnMainThread:@selector(updateIndicator) withObject:nil waitUntilDone:YES];
        [NSThread sleepForTimeInterval:0.5];
    }
}

-(void)updateIndicator {

    [indicator setDoubleValue:monitor.progress];
}
@end

Не удалось найти метод setDoubleValue в классе NSProgressIndicator.

Ответы [ 2 ]

2 голосов
/ 23 мая 2011

Не удалось найти метод setDoubleValue в классе NSProgressIndicator

Для этого, потому что NSProgressIndicator является частью AppKit (библиотека GUI Какао), и вы только ссылаетесь наФонд (который не является материалом GUI).Кажется, что в вашем коде вы пытались определить интерфейс для NSProgressIndicator самостоятельно, но вы не объявили никаких методов для него - поэтому он жалуется на невозможность найти метод setDoubleValue.

Что следует сделатьты об этом?Что ж, если вы хотите использовать GUI от Cocoa, вам нужно структурировать свою программу так, как ожидает система Cocoa от Cocoa.В XCode, если вы создаете новое приложение Какао, оно должно дать вам пример проекта для дальнейшего развития.В частности, ваша main() функция должна содержать return NSApplicationMain(argc, (const char **) argv);, которая обрабатывает запуск цикла выполнения для получения событий.

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

Мне трудно поверить, что это пример из книги, так как он выглядит довольно принципиально разбитым!

Другие ошибки, которые я обнаружил при попытке запустить его:

Ожидается ')'before': 'token

Это на линии heartbeat->thread = [[NSThread alloc]initWithTarget:heartbeat selector:(heartbeatThread:) object:nil];.

Проблема заключается в синтаксисе объявления селектора: вместо того, чтобы просто сказать selector:(heartbeatThread:), вам нужно сказать selector:@selector(heartbeatThread:).

'thread' undeclared (первое использование вthis function '

В своем заголовочном файле вы заявили, что класс Heartbeat имеет метод с именем stop. (То есть вы определили -(void)stop; в разделе @interface для Heartbeatclass).

Однако вы реализовали этот метод в разделе @implementation для класса Process.

Вы бы упростили себе, если бы у вас была одна пара .h и.m файлов на класс, вместо того, чтобы пытаться объединить несколько определений классов в одну пару файлов. Таким образом, вы можете убедиться, что вы помещаете реализацию метода stop в файл .m правильного класса.

свойство 'progress' требует определения метода '-progress' - используйте @synthesize, @dynamic или предоставьте реализацию метода

В реализации для process вы определили @свойство calсветодиод progress.Если вы определяете свойство, вам нужно либо написать для него геттеры и сеттеры, либо написать @synthesize progress в своей реализации.Выполнение последнего эквивалентно тому, как Objective-C автоматически генерирует ваши геттеры и сеттеры во время выполнения.

1 голос
/ 23 мая 2011

thread не является членом класса Process; принадлежит к классу Heartbeat. Вы должны определить член в классе Process, чтобы сохранить ссылку на экземпляр Heartbeat, чтобы можно было вызывать методы для его thread члена.

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