3

这是我的第一篇文章,所以让我非常感谢外面的所有发帖人(我被动地广泛使用 - 太棒了!)

我正在使用旧的 Quicktime API 为 Mac OS X 开发视频导出工具。

简介:我从多个输入电影中剪切帧并将它们排列(缩放)到一个新的输出电影(一种媒体亭)。

由于许多需要的 QT 功能(例如编写时间码...)需要嵌套在 32 位应用程序中,我决定使用 32 位命令行工具离线执行此操作。该工具逐帧渲染(离线)并以 0.0 和 1.0 之间的值打印当前进度

它由主应用程序(Cocoa、GUI、现代的东西)通过 NSTask 调用。黑啤酒被 NSPipe 捕获。

我查看了一些示例,并将快速概述我的代码:

NSTask *task;
NSPipe *pipe;
float progress;

// prepare the offline process
// 
//
-(void) prepareOfflineExport {

    task = [[NSTask alloc] init];        
    pipe = [[NSPipe alloc] init];

    [task setLaunchPath:pathToRenderer];
    [task setStandardOutput:pipe];
}

// arguments are passed outside
// invoke the process
//
-(void) startOfflineExport {

    progress = 0.0f;        

    NSArray *argv = [NSArray arrayWithObjects: /* command line args */, nil];
    [task setArguments:argv];

    NSFileHandle *fh = [pipe fileHandleForReading];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataReady:) name:NSFileHandleReadCompletionNotification object:fh];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskTerminated:) name:NSTaskDidTerminateNotification object:task];

    [task launch];

    [fh readInBackgroundAndNotify];
}

// called when data ready
// 
//
-(void) dataReady:(NSNotification*)n {

    NSData *d = [[n userInfo] valueForKey:NSFileHandleNotificationData];

    if([d length]) {

        NSString *s = [[NSString alloc] initWithData:d encoding:NSUTF8StringEncoding];
        progress = [s floatValue];
    }
}

// called when process exits
// 
//
-(void) taskTerminated:(NSNotification*)n {

    task = nil;
    progress = 1.0f;
}

现在的问题:

在 Xcode 中启动应用程序时(通过“运行”),一切正常。调用正确完成,该过程在活动监视器中可见,并且 NSLevelIndicator(在创新应用程序的人上)根据(浮动)进度变量进行得很好。

但是:如果我“归档”应用程序并在 Xcode 之外执行它,我的命令行工具的标准输出似乎永远不会到达应用程序。我试着写一个调试文件

-(void) dataReady:(NSNotification*)n

没有机会,它永远不会被调用!我在几台Mac上测试了这个问题,同样的问题......

我是否犯了明显的错误,或者是否有一些偏好配置(沙盒已关闭),可能是我忽略的已知问题?

谢谢你的帮助

问候垫

4

0 回答 0