2

私のソフトウェアには、重要なレイテンシーの問題を引き起こす2つの機能があります。ソフトウェアはObjective-Cで書かれています。USBデバイスからシリアルデータを受信します。私の目標は、それらをカプセル化してから、データを処理する別のオブジェクトに送信することです。

プログラムのこのセクションでは、CPUとレイテンシの大きな問題が発生しますが、これを解決する方法がまったくわかりません。デバイスは、状態が変化したときにのみデータを送信します。したがって、多くの変化がうまく発生すると、すべてが遅延します。

- (void)getSerialData {
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
    [self getSerialDataLoop];
    });
}

- (void)getSerialDataLoop {

readThreadRunning = YES;

char byte_buffer[2]; // buffer for holding incoming data
int numBytes=0; // number of bytes read during read
NSString *text;

// this will loop untilthe serial port closes
while(TRUE) {
    // read() blocks until some data is available or the port is closed
    numBytes = (int)read(serialFileDescriptor, byte_buffer, 1); // read up to the size of the buffer

    if(numBytes>0) {
        ///text = [NSString stringWithCString:byte_buffer encoding:NSSymbolStringEncoding];
        if(![text isEqualToString:@""]){
            text = [NSString stringWithUTF8String:byte_buffer];
            [self performSelectorOnMainThread:@selector(processNSStringData:) withObject:text waitUntilDone:YES];
        }
    } else {
        break; // Stop the thread if there is an error
    }

}
// make sure the serial port is closed
if (serialFileDescriptor != -1) {
    close(serialFileDescriptor);
    serialFileDescriptor = -1;
}

// mark that the thread has quit
readThreadRunning = FALSE;
}

何かアイデアやアドバイスはありますか?

4

1 に答える 1

1

あなたは基本的にNSStreamここで再発明しました。最初に、実行ループに関連付けられているこの既に利用可能なソリューションを調査することをお勧めします。

また、 への呼び出しに圧倒されてしまうこともありますgetSerialData。システムには、このルーチンへの複数の呼び出しを防ぐものは何もありません。複数の呼び出しを行うと、同時操作の決闘が発生します。を使用NSStreamすると、それに対処できます。ただし、いずれにしても、既に実行中の場合は、新しい読み取りブロックを作成し続けるべきではありません。

また、一度に 1 バイトを読み取って処理しています。これはおそらくあなたの最大の影響です。バイトごとにメインスレッドにコールバックすると、かなりコストがかかる可能性があります。他に何もなければNSString、すべてのバイトに対して新しいオブジェクトを作成しています。

コードは非常に危険であり、クラッシュする可能性があることに注意してください。を初期化することはなくbyte_buffer、1 バイトだけを読み込みます。を呼び出すときstringWithUTF8String:、スタックの現在の状態に応じて、2 番目のバイトが \0 であると想定しています。

于 2012-10-25T00:22:48.183 に答える