使用 Core Graphics/Cocoa,您可以从后台线程绘制位图上下文吗?

2023-11-23

我正在屏幕外绘制CGContext创建使用CGBitmapContextCreate,然后生成一个CGImage从它与CGBitmapContextCreateImage并将其绘制到我的视图中drawRect(我还在此基础上绘制了一些其他内容 - 这是隔离不同级别的可变性和复杂性的练习)。

当它全部在主线程上运行时,这一切都工作正常。然而,以这种方式拆分的动机之一是,屏幕外部分可以在后台线程上运行(我认为应该没问题,因为它不会渲染到屏幕上上下文)。

然而,当我这样做时,生成的图像是空的!我检查了代码,并放置了明智的 NSLog 来验证一切是否按正确的顺序发生。

我的下一步是将其归结为重现问题的最简单的代码(或者找到一些我遗漏的愚蠢的东西并修复它) - 此时如果有必要,我将在此处发布一些代码。但我首先想在这里检查一下我是否走错了路。我在谷歌圈的旅行中找不到任何可以阐明任何方式的东西 - 但一位朋友确实提到他在尝试在后台线程中调整图像大小时遇到​​了类似的问题 - 这表明这里可能存在一些一般限制。

[edit]

感谢到目前为止的回复。如果没有别的事情,他们告诉我,至少我并不是唯一一个没有答案的人——这也是我想找到的答案的一部分。此时,我将投入额外的工作来获取最简单的示例,并且可能会返回一些代码或更多信息。同时,请随时提出任何想法:-)

需要指出的一点是:有几个人使用过这个术语线程安全关于 API。需要注意的是,在这种情况下有两种类型的线程安全:

  1. API 本身的线程性 - 即它是否可以在多个线程中使用(全局状态和其他重入问题(例如 C 的 strtok)也是 API 可能不是线程安全的常见原因)。
  2. 各个操作的原子性 - 多个线程是否可以通过 API 与相同的对象和资源交互,而无需应用程序级锁定?

我怀疑到目前为止提到的是第一种类型,但如果您能澄清,我将不胜感激。

[编辑2 - 解决了!]

好的,我一切顺利。执行摘要是问题出在我身上,而不是位图上下文本身。

在我的后台线程中,就在进入位图上下文之前,我正在对其他一些对象进行一些准备。事实证明,对其他对象的调用间接导致在某些视图上调用 setNeedsDisplay! 通过将执行此操作的部分分离到主线程,现在一切都可以完美运行。

因此,对于任何遇到这个问题想知道是否可以在后台线程上绘制位图上下文的人来说,答案是可以(此处和答案中已提出警告)。

谢谢大家


只是猜测,但如果您尝试从另一个线程调用 setNeedsDisplay,则需要通过 PerformSelectorOnMainThread 来调用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Core Graphics/Cocoa,您可以从后台线程绘制位图上下文吗? 的相关文章

  • CoreMediaIO,错误更新的属性 kCMIODevicePropertyDeviceIsRunningSomewhere

    当某些进程开始使用相机时 我需要接收一个事件 我通过 CMIOObjectGetPropertyData 完成此操作 但它不能正常工作 只有第一次访问时才是正确的值 我还尝试使用 CMIOObjectAddPropertyListenerB
  • 为 Linux 编译 Objective-C 应用程序(API 覆盖范围)

    我可能在这里问一些奇怪的问题 但我不确定从哪里开始 问题是我正在考虑使用 Obj C 和 Foundation 类在 Mac 上编写一个命令行工具 但存在一个非常大的风险 那就是我希望能够为不同的 Linux 发行版编译它 以便将来作为服务
  • UIButton 图像未更改/更新

    首先 我对 Objective C 还很陌生 并且仍在尝试尽可能多地学习 所以请耐心等待 现在我有一个以编程方式创建的 UIButton 按下按钮时 将显示一个 UIActionSheet 其中包含 相机 选择照片 或 取消 选项 然后 按
  • 有哪些学习线程编程的好资源? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 随着多核CPU在桌面上的兴起 多线程技能将成为程序员的宝贵资产 您能为想要学习线程编程的程序员推荐一些好的资源 书籍 教程 网站等 吗 看
  • 线程安全的异步字节队列

    我有一个回调方法 只要有新数据可用 就会调用该方法 public delegate void DataCallback byte buffer int offset int count 我想将其包装在一个实现与此类似的接口的类中 publi
  • ThreadPoolExecutor 和队列

    我以为使用线程池执行器 http docs oracle com javase 6 docs api java util concurrent ThreadPoolExecutor html我们可以提交Runnables 要在以下位置执行B
  • iPhone iOS 保存从 UIImageJPEGRepresentation() 获得的数据第二次失败:ImageIO: CGImageRead_mapData 'open' failed

    我的 UIImage 操作遇到了一个奇怪的问题 我正在进行保管箱同步 并且必须将我的图像存储为本地文件 为此 我使用以下命令保存它们UIImagePNGRepresentation image or UIImageJPEGRepresent
  • 如何在 iOS 中查找蓝牙音频设备

    好的 我正在开发一个有趣的项目 该项目有一个障碍 我需要为我的 iOS 应用程序启用蓝牙音频支持 我遇到的障碍是我什至无法开始获取已连接的蓝牙音频设备的列表 即使我的 iPhone 5S 可以识别我的耳机 大约 3 4 岁的耳机 LG HB
  • 如何在给定点停止线程?

    我试图停止一些线程 阅读一些有关优雅地执行此操作的正确方法的内容 但我一定做错了什么 因为它根本不起作用 起初我尝试不使用lock with IsRunning不稳定 然后尝试使用锁 这是我所拥有的 private volatile boo
  • 最近打开的应用程序[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有什么方法可以获取最近打开的应用程序 例如 4 个 的列表吗 如果是这样 怎么办 可可麦克 看看LaunchServices LSSh
  • 如何知道用户何时更改设置包

    我让用户在 iPhone 的设置区域中更改他们的设置 在下一次网络同步期间 我想将用户更改发送到服务器 但前提是做出改变 但是我如何知道用户何时在设置区域中进行了更改 如果可以的话 我想避免选择总是发送信息 无论是否更改 或者首先从服务器获
  • Parse.com 从相关 PFObject 获取 PFUser

    我正在将照片保存为 PFObject 解析 并使用 PFUser currentUser 用户 ID 作为其键之一 我想在表格视图中显示照片以及该 PFUser 的详细信息 但是当我尝试获取用户时 PFUser user self phot
  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 如何禁用 iPhone 邮件应用程序中的电话号码链接?

    我的公司正在发送数字电子邮件收据 但遇到了 iPhone Mail 检测数字数据并将其自动链接为电话号码的问题 我已经看到元标记应该可以解决 iPhone 上的 Mobil Safari 中的问题 但该技巧似乎不适用于 Mail 有谁知道如
  • insertNewObjectForEntityForName:

    我使用 Xcode xcdatamodel 文件编辑器设置了一个实体 我创建了一个名为 Person 的实体 添加了一些属性 然后生成了一个 m 文件来表示它 一切都很好 现在 当我去编写一行代码时 例如 Person person Per
  • 在 iPhone 中缝合图片

    我想并排缝合2张png 在Cocoa中 我会使用 NSImage initWithSize 然后只是drawInRect 但是 UIImage 没有 initWithSize 类 我现在该怎么做 Use UIGraphicsBeginIma
  • 如何阻止 UITableView moveRowAt IndexPath 在重新排序时留下空白行

    我遇到一个问题 在重新排序 UITableViewCells 时 tableView 不随单元格滚动 仅出现一个空白行 任何后续滚动都会出现数组越界错误 堆栈跟踪中没有我的任何代码 这是该问题的快速视频 http www screencas
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 如何在 iOS 8 中关闭两个 UIViewController?

    我正在使用 Objective C 开发 iPhone 应用程序 由于我需要一次关闭两个 UIViewController 所以我使用下面的代码 self presentingViewController presentingViewCon
  • 在发生更改事件时将货币格式重新应用到 UITextField

    我正在使用一个包含本地化货币值的 UITextField 我看过很多关于如何使用此功能的帖子 但我的问题是 如何在每次按键后将货币格式重新应用到 UITextField 我知道我可以通过以下方式设置和使用货币格式化程序 NSNumberFo

随机推荐

  • 如何识别并设置 Maven 中缺少的环境属性?

    我进行了构建设置 以便通过命令行传递变量 mvn clean install DsomeVariable data 在我的 pom 中我有
  • 如何在Python中将有符号整数转换为无符号整数

    假设我有这个号码i 6884376 我如何将其称为无符号变量 就像是 unsigned long i in C Assuming 你心里有 2 的补码表示 和 By unsigned long you mean无符号 32 位整数 那么你只
  • 如何为Web方法传递可选参数?

    我有一个带有多个参数的网络方法 web方法只依赖2个字段 其余都是可选的 OperationContract public string WarehouseContactInformation int WAID Required strin
  • (一般)从自定义数据类型构建解析器?

    我正在开发一个需要与服务器通信的网络流媒体客户端 服务器将响应编码为字节串 例如 1 NULJohn NULTeddy NUL501 NUL 其中 NUL 是分隔符 上面的响应翻译为 这是一条类型1的消息 由服务器硬编码 它告诉客户端用户的
  • 仅使用 sed 或 awk 从 html 页面提取 url 的最简单方法

    我想从 html 文件的锚标记中提取 URL 这需要在 BASH 中使用 SED AWK 来完成 请不要使用 Perl 做到这一点最简单的方法是什么 你也可以做这样的事情 前提是你安装了 lynx Lynx 版本 lynx dump lis
  • 理解 Java 字节

    因此 昨天在工作中 我必须编写一个应用程序来计算 AFP 文件中的页数 所以我重新整理了 MO DCA 规范 PDF 并找到了结构化字段BPG Begin Page 及其 3 字节标识符 该应用程序需要在 AIX 机器上运行 因此我决定用
  • Linux下获取缓冲区的物理地址

    我在具有完整 MMU 的 Xilinx Microblaze 上运行 Linux 内核 3 3 我正在执行的任务要求我了解以下内容 我需要创建一个文本文件 缓冲区 并找到该缓冲区的物理地址 并且我不希望内核将此文件写入不连续的内存区域 我需
  • 单击时复制文本字符串

    我希望能够在单击时复制文本字符串没有按钮 文本字符串将位于 span 类内 用户将鼠标悬停在文本字符串上 用户单击文本字符串 文本字符串被复制到剪贴板 您可以附上copy事件至 span 元素 使用document execCommand
  • 将 Spring 参数添加到 VSCode Debug launch.json

    我正在 VSCode 中使用 Java Springboot 2 1 2 应用程序 我的调试器正在工作并且可以运行该应用程序 但是 我很难将 Spring 特定参数添加到运行命令中 我环顾四周但似乎找不到任何关于此的信息 我试图告诉 spr
  • 模块构建失败:类型错误:无法读取未定义的属性“newLine”

    昨天一切都运行良好 现在当我尝试提供服务时出现以下错误 src main ts 中出现错误 模块构建失败 类型错误 无法读取未定义的属性 newLine 在 Object getNewLineCharacter Users leongaba
  • Python 环境应该使用 conda 或 conda-forge 吗?

    Conda and conda forge都是 Python 包管理器 当两个存储库中都存在包时 正确的选择是什么 例如 Django 可以使用其中任何一个安装 但两者之间的区别在于几个依赖项 conda forge 还有更多 没有对这些差
  • 避免 XDMP-EXPNTREECACHEFULL 并加载文档

    我正在使用 marklogic 4 并且有大约 15000 个文档 每个文档大约 10 KB 我想将整个内容作为文档加载 并将所有文档转换为单个 csv 文件并输出到 HTTP 输出流以供下载 当我以这种方式加载文档时 let uri ct
  • 隐式解析失败?

    我一直致力于 无形风格 的实现冈崎密集二进制数系统 它只是一个类型级的位链表 某种HList二进制的Digits 我已经完成了操作的初稿 其中包括您期望的自然数标准数学运算 直到现在我才意识到我的编码存在一个大问题 如何修复我的隐式分辨率I
  • 包含一个文件作为字符串[重复]

    这个问题在这里已经有答案了 是否有预处理器技巧允许我将文件作为字符串 包含 在标头中 像这样的东西 a txt lorem ipsum dolorem sit amet 和 魔法 包括类似这样的调用 header h MAGICINCLUD
  • 从html中获取类名的正则表达式

    我知道我的问题可能看起来像重复这个问题 但它不是我正在尝试匹配里面的类名html文本来自服务器作为使用 JavsScript RegExp 的模板并将其替换为另一个类名 代码如下 div class a b c d div div clas
  • 为什么 PHP 更喜欢 __call() 而不是 __callStatic()?

    当我尝试这个时
  • Azure 函数详细跟踪日志记录到 Application Insights

    我有一个连接到 App Insights 实例的 Azure 函数 函数应用程序会发出日志消息 我可以在 Azure 门户的日志流中以及 App Insights 跟踪中看到这些消息 我通过添加一个将控制台日志级别增加到详细 tracing
  • 最简单的 SOAP 示例

    使用 Javascript 的最简单的 SOAP 示例是什么 为了尽可能有用 答案应该 实用 换句话说 实际工作 发送至少一个可以在代码中其他位置设置的参数 处理至少一个可以在代码中其他位置读取的结果值 适用于大多数现代浏览器版本 尽可能清
  • 仅使用 xslt 1.0 小写字符串的第一个字符

    我见过patterns对于那些使用 xslt 1 0 的人来说 使用 translate 函数将字符串翻译成小写 或大写 有没有一种优雅的方法可以将字符串的第一个字母变成小写 TestCase gt testCase 例如 如果您的字符串位
  • 使用 Core Graphics/Cocoa,您可以从后台线程绘制位图上下文吗?

    我正在屏幕外绘制CGContext创建使用CGBitmapContextCreate 然后生成一个CGImage从它与CGBitmapContextCreateImage并将其绘制到我的视图中drawRect 我还在此基础上绘制了一些其他内