2012-02-02 1 views
2

私は可変サイズ(数MBから1GB以上まで)のQTMovieオブジェクトを取り出し、ディスクにエクスポートするのにwriteToFile:withAttributes:を使用しようとしています。これは長い時間がかかり、UIをロックするので、私はGrand Central Dispatchを使用して別のスレッドに配置することに決めました。QTMovieがアプリケーションのUIをフリーズするのを止めるにはどうしたらいいですか?

私が知る限り、これは完全に問題なく動作しますが、writeToFile:withAttributes:を使用してもアプリケーションはロックされます。ファイルをエクスポートしますが、完了するまでUIで何もできません。

QTKitとGoogleのさまざまな場所で複数のスレッドを使用しているすべてのドキュメントを調べましたが、何も試したことがないようです。続き

はトラブルを抱えているように見えるコードです:

[movie detachFromCurrentThread]; 

dispatch_queue_t combineQueue = dispatch_queue_create("com.Combinate.movieCombineQueue", NULL); 

dispatch_async(combineQueue, ^{ 

    [QTMovie enterQTKitOnThreadDisablingThreadSafetyProtection]; 
    [movie attachToCurrentThread]; 
    [movie writeToFile:filepath withAttributes:exportAttributes]; 

    [movie detachFromCurrentThread]; 
    [QTMovie exitQTKitOnThread]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [movie attachToCurrentThread]; 
     [self finishedCombiningAudioFiles:(QTMovie *)movie]; 
    }); 

}); 

dispatch_release(combineQueue); 

答えて

0

だから私も、バックグラウンドスレッドで映画の書き込みを行うにしようとしてきた、と私は非常にあるAppleが持っていたサンプルコードを使用しましたあなたがそこにあるものに似ていますが、私は奇妙なものを見つけました。

私は故障だったと私は

[movie detachFromCurrentThread] 

が実際にあなたが本当に速い自分で確認することができます(失敗していた、それが成功BOOLを返すことがわかった場所を確認しようとして始めた。

私はいただきまし把握することはできませんQTKitがデタッチをやめないようにするために、私はさまざまな属性を設定しようとしましたが、デタッチできないという変更はありません。メインスレッドを続けることができます。デタッチに失敗しても動作します。あなたが言うことを止めてフリーズしますUIをアップ。

OSErr er = DetachMovieFromCurrentThread([movie quickTimeMovie]); 

実際にQTKitもお使いいただけ呼び出しが失敗したときに私のためにデタッチをするのか:QuickTimeはあなたが機能を得ることができるフレームワークの中にあなたが少し深く潜る場合

さらにプロービングは、私に修正を与えています。ムービーはバックグラウンドで楽しく書かれ、UIはもはやフリーズしません。

うまくいけば、それはあなたのために物事を動かすだろう。

+0

ありがとうございました。これは実際に正しい方向に私を指摘した。 64ビットアプリケーションでは、 - (Movie)quickTimeMovieメソッドは使用できません.32ビットアプリケーションのみです。私は ' - (BOOL)detachFromCurrentThread'が実際に' DetachMovieFromCurrentThread'をその実装で使用しているので、なぜ失敗したのかを説明すると思います。それを働かせるためには、私がしなければならなかったのは、64ビットではなく32ビットとしてコンパイルするためにアプリを変換することでした。ほとんど理想的ですが、少なくとも動作します。 – jcocoa5

関連する問題