nanosleep () никогда не "просыпается" на OS X Lion - PullRequest
1 голос
/ 18 ноября 2011

Я использую XCode 4.2 в Lion.Когда я компилирую свое приложение с профилем Debug (нажимая Apple + R, чтобы запустить его), то когда я вызываю nanosleep, оно никогда не возвращается из этой функции.Когда-либо.Если я профилирую код (создаю профиль Release), он возвращается.Я просто использую настройки профиля по умолчанию для проекта XCode.Есть идеи, что здесь может происходить?

Чтобы воспроизвести это, создайте совершенно новое пустое приложение и поместите следующий код в appDelegate.m:

#import "AppDelegate.h"
#import <time.h>

@implementation AppDelegate

@synthesize window = _window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSLog(@"Hello");
    struct timespec a;
    a.tv_nsec = 10000;

    /** THE FIX! **/
    a.tv_sec = 0;
    /** THE FIX! **/

    nanosleep(&a,NULL);
    NSLog(@"World");
}

@end

Ожидаемое поведение: Вывести «World» на консоль отладки через 0,01 мс после Hello.

Фактическое поведение: Печатается только «Hello» и окно не появляется.

Ответы [ 2 ]

6 голосов
/ 18 ноября 2011

Попробуйте явно установить a.tv_sec в 0. Вероятно, он инициализируется каким-то мусором и заставляет наноспать спать в течение очень длительного количества секунд.


Или вы можете использовать usleep

#include <unistd.h>

...

NSLog(@"Hello");
usleep(10);      // 0.010 ms = 10 µs = 10000 ns
NSLog(@"World");
1 голос
/ 18 ноября 2011

Ваша структура размещена в стеке, поэтому у вас могут быть ненужные / остаточные данные.

Поскольку структура timespec также имеет член tv_sec, вам также следует установить 0:

struct timespec a;

a.tv_sec  = 0;
a.tv_nsec = 10000;

nanosleep( &a, NULL );
...