2010-04-05 60 views
0

最近我開始了一個項目,可以將一些預先計算的Grafix/Audio導出到文件中,以便後續處理。表單和線程內存問題

所有我做的是我的主要XIB把一個新的窗口(與progressindicator和中止按鈕),並使用下面的代碼打開一看:

[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文件。其中的工作很好,但經過一段時間後,事實證明,主線程沒有響應了,我的記憶足跡擡升勢不可擋。我試着用Instruments進行調試,並看到很多CFHash等東西都在向無窮大發展。

偶然我點擊了下面的表單,並暫時它幫助,主線程(AppKit?)釋放它的東西,但只是一段時間。

我無法向我解釋,首先我認爲這是從我的線程訪問進度條更新進度(間隔0.5秒),所以我把它剪掉了。但即使我沒有更新任何內容,也沒有對進度條進行任何操作,但我的應用程序因爲沒有釋放它的「主要事件」或任何東西而吃掉了所有內存。

有沒有可能「流失」這個主線程內存的東西(Runloop/NSApp調用?)。以及爲什麼主線程不再響應(在這個簡單的任務之後)?

我沒有眼鏡了,請幫忙!

在此先感謝!

P.S.你們如何實現「線程長任務」的東西,並更新你的gui?

+0

在Instruments中,查看分配CFHash的內容。 – 2010-04-06 12:13:29

回答

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

有你這樣做是有原因的?一張紙將會阻塞它的父窗口,而你不必做任何這樣的事情。您可以防止在您的應用程序委託中退出。

如果你真的需要上面的代碼,嘗試在發送runModalSession:消息之前創建自動釋放池,然後在排除它之後(但在比較NSRunContinuesResponse和中斷之前)。