0

我对这段代码有问题。基本上我想从定时器函数异步执行 fwrite。

这是我的 Timer 函数中的代码块。(这将由计时器每 0.2 秒调用一次。

-(void)timerFunction
{

       WriteFileOperation * operation =
       [WriteFileOperation writeFileWithBuffer:pFile buffer:readblePixels length:nBytes*15];
       [_queue addOperation:operation]; // Here it is waiting to complete the fwrite
}

WrtiteFilerOperation 是一个 NSoperation 类,它必须将传递的缓冲区写入文件。我在 WriteFileOperation 的“start”方法中添加了这段代码。

- (void)start

{

    if (![NSThread isMainThread])
    {
        [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO];
        return;
    }


    [self willChangeValueForKey:@"isExecuting"];
    _isExecuting = YES;
    [self didChangeValueForKey:@"isExecuting"];

    NSLog(@"write bytes %d",fwrite(_buffer, 1, _nBytes, _file));
    free(_buffer);
    [self finish];
}

这里的问题是,我的 timerFunction 被 NSOperation 阻塞,直到它将缓冲区写入文件。(我的意思是阻塞直到 start 方法完成其执行)并且性能似乎与直接将 fwrite 放入 timerFunction 相同。

我只想返回 timerFunction 而无需等待 start 方法执行完成。

我在这里做错了什么?

提前致谢

拉古

4

1 回答 1

1

您的操作是阻塞的,因为您强制操作start在主线程上运行其方法,从而消除了使用 NSOperationQueue 的任何好处。相反,我建议删除-start您在上面看到的实现并将代码移动到-main

- (void)main
{
    NSLog(@"write bytes %d",fwrite(_buffer, 1, _nBytes, _file));
    free(_buffer);
    [self finish];
}

NSLog 应该在某个时候被删除以提高性能。如果您做的不止这些,您可能还需要将上述内容包装在 NSAutoreleasePool 中。

为了防止多个线程同时写入文件,您应该使用如下代码将最大并发操作数设置为 1:

[_queue setMaxConcurrentOperationCount:1];
于 2010-03-11T13:34:03.203 回答