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 の「開始」メソッドに追加しました。

- (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];
}

ここでの問題は、バッファーをファイルに書き込むまで NSOperation によってブロックされた timerFunction です (開始メソッドが実行を終了するまでブロックされることを意味します)。

startメソッドの実行が完了するのを待たずにtimerFunctionに戻りたいです。

ここで何が間違っていますか?

前もって感謝します

ラグー

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 に答える