0

アプリの起動時に開くメイン ビュー (または cocos2d のシーン) があります。そこから audioUnit を呼び出して、microphone からの入力オーディオを聞きます。それはうまく機能します(audioUnitのコールバックは常に呼び出され、何かを行います)が、メインスレッドが必要であることがわかります-メインシーンにはUILabel必要ないものと、メインスレッドにする必要があるその他のものがあります変更される。

main scene私は最初に行う:

remoteIns=[[remoteIO alloc]init]; //turn on the callback function on class remoteIO .
[remoteIns StartListeningWithFrequency]; // this function takes the main thread

その後、main scene後でチェックインすると:

NSLog(@"isMainThread%d",[NSThread isMainThread]);

メインスレッドではないことがわかります。したがって、変更できませんUILabels

audioUnit 関数 (別のクラス) を開始し、それを別のスレッドに設定し、メイン シーンをメイン スレッドのままにし、正常に動作させる必要がありますaudioUnit

4

2 に答える 2

2

メイン スレッドで何かを実行するより簡単な方法は、ブロックを使用することです。このようにして、複数の操作を実行でき、「通常の」コードのように見えます。また、3 つ以上の引数を取るルーチンを呼び出すのも簡単です

dispatch_sync(dispatch_get_main_queue(), ^{
    // Any code that you put in here will be run on the main thread.
    // However, MAKE SURE that you do not actually call this from the main thread or
    // your program will hang!

    // i.e.:
    self.label.text = @"New text";       
});
于 2012-11-28T00:14:26.247 に答える
0

オーディオ ユニットはメイン スレッドにありません。しかし、メイン シーンもメイン スレッドにはありません。

メイン シーンで UILabel を変更するには、ほとんどがメイン スレッドなので、テキストを次のように変更します: (テキストを変更する関数を呼び出すためにシーン オブザーバーで呼び出されます:

[self performSelectorOnMainThread: @selector( updateText: ) withObject: bits waitUntilDone: YES];

そしてupdateText:私はテキストを変更します。それはうまくいきます。

于 2012-11-27T10:31:41.380 に答える