0

最近我开始了一个项目,它可以将一些预先计算的 Grafix/Audio 导出到文件中,以供后处理。

我所做的只是在我的主 xib 中放置一个新窗口(带有进度指示器和一个中止按钮)并使用以下代码打开它:

[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?)正在释放它的东西,但只是一段时间。

我无法向我解释,首先我认为这是从我的线程访问 Progressbar 以更新进度(间隔为 0.5 秒),所以我把它删掉了。但是,即使我没有更新任何内容并且没有对进度条做任何事情,我的应用程序也会占用所有内存,因为没有释放它的“主事件”或任何东西。

有没有可能“耗尽”这个主线程内存的东西(Runloop / NSApp 调用?)。为什么主线程不再响应(在这个简单的任务之后)???

我没有clou了,请帮助!

提前致谢 !

PS你们如何实现“线程长任务”的东西并更新你的gui?

4

1 回答 1

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

你这样做是有原因的吗?工作表将阻止其父窗口,而您无需执行此类操作。您可以在您的应用委托中阻止退出。

如果您确实需要上述代码,请尝试在发送runModalSession:消息之前创建一个自动释放池,然后在之后(但在您比较NSRunContinuesResponse和中断之前)将其排空。

于 2010-04-06T12:16:29.420 回答