我在Lion中使用XCode 4.2。当我使用Debug配置文件编译我的应用程序时(按Apple + R运行它),然后当我调用nanosleep时,它永远不会从该函数返回。永远。如果我分析代码(构建发布配置文件),那么它确实返回。我只是使用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
预期行为:在Hello之后0.01 ms将“World”打印到调试控制台。
实际行为:仅打印“Hello”并且不显示任何窗口。
答案 0 :(得分:6)
尝试明确地将a.tv_sec
设置为0.可能它被初始化为一些垃圾并使纳米睡眠持续很长时间。
或者,你可以use usleep
#include <unistd.h>
...
NSLog(@"Hello");
usleep(10); // 0.010 ms = 10 µs = 10000 ns
NSLog(@"World");
答案 1 :(得分:1)
您的结构在堆栈上分配,因此您可能有垃圾/残留数据。
由于timespec
结构也有tv_sec
成员,您还应将其设置为0:
struct timespec a;
a.tv_sec = 0;
a.tv_nsec = 10000;
nanosleep( &a, NULL );