gpt4 book ai didi

ios - 调用 CFReadStreamRead 停止线程中的执行

转载 作者:行者123 更新时间:2023-11-29 11:14:09 24 4
gpt4 key购买 nike

NB: The entire code base for this project is so large that posting any meaningful amount wold render this question too localised, I have tried to distil any code down to the bare-essentials. I'm not expecting anyone to solve my problems directly but I will up vote those answers I find helpful or intriguing.

这个项目使用了 AudioStreamer 的修改版本播放保存到本地设备 (iPhone) 的音频文件。

使用此代码在当前循环中设置和安排流(据我所知,标准 AudioStreamer 项目未更改):

CFStreamClientContext context = {0, self, NULL, NULL, NULL};
CFReadStreamSetClient(
stream,
kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
ASReadStreamCallBack,
&context);
CFReadStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);

ASReadStreamCallBack 调用:

- (void)handleReadFromStream:(CFReadStreamRef)aStream
eventType:(CFStreamEventType)eventType

在 AudioStreamer 对象上,这一切工作正常,直到使用以下代码读取流:

BOOL hasBytes = NO;  //Added for debugging
hasBytes = CFReadStreamHasBytesAvailable(stream);

length = CFReadStreamRead(stream, bytes, kAQDefaultBufSize);

hasBytesYES 但是当调用CFReadStreamRead 执行停止时,App 不会崩溃它只是停止兴奋,下面的任何断点CFReadStreamRead 调用未命中,ASReadStreamCallBack 未再次调用。

我不知道是什么原因导致的,我最好的猜测是线程正在终止?但是我要问的原因和原因是什么。

有没有人见过这种行为?非常欢迎我如何追踪它以及关于如何解决它的想法!

通过评论请求的附加信息

  1. 这是 100% 可重复的
  2. CFReadStreamHasBytesAvailable 是我为调试添加的,但删除它没有任何效果

最佳答案

首先,我假设 CFReadStreamScheduleWithRunLoop()CFReadStreamRead() 在同一个线程上运行?

这个线程是否正在处理它的运行循环?不这样做是我的主要怀疑。您是否在此线程上调用了 CFRunLoopRun() 或等效函数?

通常没有理由产生一个单独的线程来异步读取流,所以我对你的线程设计有点困惑。这里真的有后台线程吗?此外,通常 CFReadStreamRead() 会在您的客户端回调中(当您收到 kCFStreamEventHasBytesAvailable 事件(它似乎在链接代码中)时),但您建议ASReadStreamCallBack 从未被调用。您如何修改 AudioStreamer?

关于ios - 调用 CFReadStreamRead 停止线程中的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10177500/

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