0

最近、処理後に事前計算された Grafix/Audio をファイルにエクスポートできるプロジェクトを開始しました。

私が行っていたのは、メインの xib に新しいウィンドウ (progressindicator と Abort ボタンを使用) を配置し、次のコードを使用して開いたことだけです。

[NSApp beginSheet: REC_Sheet modalForWindow: MOTHER_WINDOW modalDelegate: self didEndSelector: nil contextInfo: nil];

NSModalSession session=[NSApp beginModalSessionForWindow:REC_Sheet];
RECISNOTDONE=YES;
while (RECISNOTDONE) {
    if ([NSApp runModalSession:session]!=NSRunContinuesResponse)
        break;
    usleep(100);
}

[NSApp endModalSession:session];

実際に作業を実行し、すべての targas/wave ファイルを保存するために、バックグラウンド スレッド (pthread) が以前に開始されました。これはうまく機能しましたが、しばらくすると、メインスレッドが応答しなくなり、メモリフットプリントが止められないほど増加したことが判明しました。Instrumentsでデバッグしようとしましたが、多くのCFHashなどが無限に成長しているのを見ました。

偶然、シートの下をクリックして一時的に助けました。

私には説明できません。まず、私のスレッドからプログレスバーへのアクセスがプログレスを更新するためだと思ったので(0.5秒間隔で)、それを切り取りました。しかし、何も更新せず、プログレスバーで何もしなかったとしても、「メインイベント」またはその他のものを解放しないため、アプリケーションはすべてのメモリを使い果たします。

このメインスレッドのメモリを「排出」する可能性はありますか (Runloop / NSApp 呼び出し?)。そして、なぜメインスレッドがもう応答しないのですか (この単純なタスクの後) ???

私はもうクロウを持っていません、助けてください!

前もって感謝します !

PS「スレッド化された長いタスク」をどのように実装し、GUIを更新していますか???

4

1 に答える 1

1
while (RECISNOTDONE) {
    if ([NSApp runModalSession:session]!=NSRunContinuesResponse)
        break;
    usleep(100);
}

そうしている理由はありますか?このようなことをしなくても、シートはその親ウィンドウをブロックします。アプリのデリゲート内で終了を防ぐことができます。

何かのために上記のコードが本当に必要な場合は、runModalSession:メッセージを送信する前に自動解放プールを作成し、その後 (ただし、比較しNSRunContinuesResponseて中断する前に) 排出してみてください。

于 2010-04-06T12:16:29.420 に答える