gpt4 book ai didi

multithreading - 纸张和线程内存问题

转载 作者:行者123 更新时间:2023-12-03 18:05:41 24 4
gpt4 key购买 nike

最近我启动了一个项目,可以将一些预先计算的 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?)正在释放它的东西,但只是一小段时间。

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

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

我已经没有了,请帮忙!

提前致谢!

附注你们如何实现“线程长任务”的东西并更新你的图形用户界面???

最佳答案

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

你这样做有理由吗?工作表将阻塞其父窗口,而您无需执行此类操作。您可以在应用程序委托(delegate)中阻止退出。

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

关于multithreading - 纸张和线程内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2579327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com