2010-04-05 62 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和中断之前)。