表和线程内存问题

时间:2010-04-05 15:49:49

标签: multithreading cocoa panel cocoa-sheet

最近我开始了一个项目,可以将一些预先计算的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 ???

1 个答案:

答案 0 :(得分:1)

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

你有没有理由这样做?工作表将阻止其父窗口,而您不必执行此类操作。您可以阻止在您的应用代理中退出。

如果您确实需要以上代码,请尝试在发送runModalSession:消息之前创建自动释放池,然后在之后(但在与NSRunContinuesResponse进行比较并中断之前)将其耗尽。