1

我在 Lion 中使用 XCode 4.2。当我使用调试配置文件(按 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 毫秒将“World”打印到调试控制台。

实际行为:仅打印“Hello”且不显示任何窗口。

4

2 回答 2

6

尝试显式设置a.tv_sec为 0。可能它被初始化为一些垃圾并使 nanosleep 睡眠很长时间。


或者,您可以使用usleep

#include <unistd.h>

...

NSLog(@"Hello");
usleep(10);      // 0.010 ms = 10 µs = 10000 ns
NSLog(@"World");
于 2011-11-17T20:15:27.010 回答
1

您的结构是在堆栈上分配的,因此您可能有垃圾/剩余数据。

由于timespec结构也有一个tv_sec成员,您还应该将其设置为 0:

struct timespec a;

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

nanosleep( &a, NULL );
于 2011-11-17T20:15:26.173 回答