0

一部のコードがバックグラウンド スレッドで実行されている間に、UIProgressBar を更新してロードしようとしています。バックグラウンド スレッドが読み込みを完了してアバターを作成したら、変数 avatarFinishedLoading を TRUE に更新する必要があります。これにより、Open GL ES 更新メソッド内のコードが機能し始めます。

- (void)viewDidAppear:(BOOL)animated
{
    [self performSelectorOnMainThread:@selector(updateProgressBar) withObject:nil waitUntilDone:NO];

    dispatch_queue_t loadAvatarAndFrames = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(loadAvatarAndFrames, ^{
        [self createAvatar];
        dispatch_async(dispatch_get_main_queue(), ^{
            avatarFinishedLoading = TRUE;
        });
    });
}

- (void)updateProgressBar {
    float progress = [threadProgressView progress];
    if (progress < 1) {
        threadProgressView.progress = progress + (float)0.01;
        [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(updateProgressBar) userInfo:nil repeats:NO];
    }else{
        [threadProgressView setHidden:TRUE];
    }
}


- (void)update
{
    // Set colour of background
    glClearColor(self.backgroundColour.x, self.backgroundColour.y, self.backgroundColour.z, self.backgroundColour.w);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    if (avatarFinishedLoading == TRUE){
       //Do Some Code
    }
}

アプリケーションが次のエラー メッセージでクラッシュする: 0xf5a2503: movzwl (%eax,%ecx,2), %eax exec_bad_access

私には問題ないように見えるので、どこが間違っているのかわかりません。

編集

バックグラウンド スレッドでこのコードを実行すると、GL エラー: 1280 が発生するようです。メイン スレッドで「createAvatar」メソッドを実行すると、GL エラーは発生せず、アバターは期待どおりにレンダリングされます。

ありがとう

4

1 に答える 1

0

メインスレッドで行われるため、ivar の設定方法に問題はありません。

dispatch_async(dispatch_get_main_queue(), ^{
      avatarFinishedLoading = TRUE;
});

-createAvatarバックグラウンドスレッドで触れてはいけないメソッドで何かに触れることは可能ですか?

于 2013-04-03T18:38:43.020 に答える