существует ли способ приостановить NSTHread неограниченно долго, и он возобновился от другого потока?

Другая опция состояла бы в том, чтобы перепроектировать DDL...

DBMS_METADATA.GET_DDL('CONSTRAINT', 'SYS_C003415')

Некоторые примеры здесь....

http://www.psoug.org/reference/dbms_metadata.html

5
задан yan bellavance 5 August 2009 в 00:17
поделиться

3 ответа

Вы хотите, чтобы ваш поток просто остановился, пока какой-то другой поток не скажет ему снова запуститься? Если это так, вы можете использовать NSConditionLock. NSConditionLock похож на условную переменную. У него есть несколько основных методов, lockWhenCondition и unlockWithCondition, а также lock. Типичное использование - это когда ваш фоновый поток ожидает блокировки условия с помощью «lockWhenCondition:», а внутренний поток переднего плана устанавливает условие, которое приводит к пробуждению фонового потока. Условием является простое целое число, обычно перечисление.

Вот пример:

enum {
    kWorkTodo = 1,
    kNoWorkTodo = 0
}

- (id)init {
    if ((self = [super init])) {
        theConditionLock = [[NSCoditionLock alloc] initWithCondition: kNoWorkTodo];
        workItems = [[NSMutableArray alloc] init];
    }
}

- (void)startDoingWork {
    [NSThread detachNewThreadSelector:@selector(doBackgroundWork) toTarget:self withObject:nil];
}

- (void)doBackgroundWork:(id)arg {
    while (YES) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        NSArray *items = nil;
        [theConditionLock lockWhenCondition:kWorkTodo]; // Wait until there is work to do
        items = [NSArray arrayWithArray:workItems]
        [workItems removeAllObjects];
        [theConditionLock unlockWithCondition:kNoWorkTodo];
        for(id item in items) {
            // Do some work on item.
        }
        [pool drain];
    }
}

- (void)notifyBackgroundThreadAboutNewWork {
    [theConditionLock lock];
    [workItems addObject:/* some unit of work */];
    [theConditionLock unlockWithCondition:kWorkTodo];
}

В этом примере, когда startDoingWork вызывается, doBackgroundWork: запускается в фоновом потоке, но затем останавливается, потому что нет никакой работы . После вызова notifyBackgroundThreadAboutNewWork выполните команду doBackgroundWork:

17
ответ дан 18 December 2019 в 08:29
поделиться

Если у вас действительно есть задачи, которые нужно выполнить в фоновом потоке, но одна задача требует завершения другой перед ее выполнением, я бы рекомендовал взглянуть на NSOperation и NSOperationQueue. NSOperation поддерживает установку очень сложных зависимостей, а NSOperationQueue будет обрабатывать планирование и выполнение этих операций на любом количестве фоновых потоков в правильном порядке. Документация Apple по этим вопросам довольно хороша, а у Дрю МакКормака есть отличная статья по этой теме на MacResearch.

2
ответ дан 18 December 2019 в 08:29
поделиться

Непонятно, что вы хотите сделать. Остановить поток и возобновить ту же функцию в новом потоке? (Это было бы бессмысленно - что не так со старым потоком?) Остановить поток и возобновить ту же функцию в другом существующем потоке?

В любом случае, нет, это невозможно, и это даже плохая идея. Правильное решение - разделить вашу функцию на две части, а затем использовать часть или весь цикл выполнения, NSTimer, методы performSelector… ,

0
ответ дан 18 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: