最近我开始了一个项目,可以将一些预先计算的Grafix / Audio导出到文件中,以便进行处理。
我所做的就是在我的主xib中放置一个新窗口(带有progressindicator和一个Abort Button)并使用以下代码打开它:
[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];
之前启动了后台线程(pthread),以实际执行工作并保存所有targas / wave文件。哪个工作得很好,但经过一段时间后,事实证明主线程不再响应,我的内存占用不可阻挡。我试图用Instruments调试它,看到很多CFHash等东西都在无穷无尽。
偶然我点击了工作表下方,暂时它有所帮助,主线程(AppKit?)正在释放它的东西,但只是一段时间。
我无法向我解释,首先我认为是从我的线程访问进度条以更新进度(间隔为0,5秒),所以我将其删除。但即使我没有更新任何内容并且没有对Progressbar做任何事情,我的应用程序也会占用所有内存,因为它不会释放它的“主要事件”或任何东西。
是否有可能“消耗”这个主线程内存的东西(Runloop / NSApp调用?)。为什么主线程不再响应(在这个简单的任务之后)???
我再也没有了,请帮忙!
提前致谢!
P.S。你们如何实现“线程长任务”的东西和更新你的gui ???
答案 0 :(得分:1)
while (RECISNOTDONE) { if ([NSApp runModalSession:session]!=NSRunContinuesResponse) break; usleep(100); }
你有没有理由这样做?工作表将阻止其父窗口,而您不必执行此类操作。您可以阻止在您的应用代理中退出。
如果您确实需要以上代码,请尝试在发送runModalSession:
消息之前创建自动释放池,然后在之后(但在与NSRunContinuesResponse
进行比较并中断之前)将其耗尽。