问题标签 [libdispatch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 使用 Ansible 在 Linux 上安装 Swift 3 + libdispatch
我正在努力在 Ubuntu 16.04 上安装 Swift 3.0 和 GCD。这在今天应该是可能的,对吧?
下面是一个 Ansible 任务,用于从 swift.org 下载 Swift 3,从 GitHub 克隆、构建和安装 swift-corelibs-libdispatch。
即使 libdispatch 的安装完成且没有错误,它也不起作用。当我尝试使用import Dispatch
Swift repl 时,它抱怨缺少功能“块”。检查 Makefile 确认,至少标志-fblocks
已提供给编译器。
这是 Swift repl 的示例输出:
用于设置盒子的 Vagrantfile:
安装 Swift 3 的 Ansible 任务:
c - libdispatch-dev SIGILL,dispatch_release 中的非法指令
我有一个在 Ubuntu linux 中使用 libdispatch 的程序。在我的主函数结束时,我有 dispatch_main() 来保持主线程挂起。我的程序的其余部分按预期运行,但由于某种原因,一旦最后调用 dispatch_main,它就会以 SIGILL 退出。运行 GDB,下面是输出。最后的回溯显示它在 dispatch_release 失败。
程序:
gdb 调试:
swift - Swift GCD 覆盖中的类型不匹配
我想使用调度 IO 通道从文件描述符中读取一些数据。创建通道后,下一步是调用read
,其声明如下:
该length
参数的文档说:
从通道读取的字节数。指定 SIZE_MAX 以继续读取数据,直到达到 EOF。
似乎很容易。就我而言,我只想这样做——读到 EOF。所以我会通过SIZE_MAX
:
精明的读者已经猜到编译器不喜欢这样:
无法将“UInt”类型的值转换为预期的参数类型“Int”
SIZE_MAX
是类型UInt
,但是length
是类型Int
。编译器提供修复它:
但是,当然,在运行时,效果并不好:
致命错误:没有足够的位来表示有符号值
自然如果SIZE_MAX
是 可以表示的最大值UInt
,则Int
不能表示。经过快速搜索,我在 Swift bug tracker 上找到了这个确切的问题。由于它似乎还没有得到解决——而且我不确定自己是否有能力通过拉取请求来解决它——我该如何解决这个问题?还是我错过了做我想做的事的方法?
Swift Stdlib 基本原理文档涵盖了导入size_t
asInt
而不是UInt
. 它归结为“更少的类型转换,并且无论如何谁需要指定高于 2^63 的数字(对不起,32 位平台)。” 很公平,但这并不包括像我这样的问题,其中使用SIZE_MAX
是 API 的一部分。
c++ - 是什么导致 MacOSX Sierra 中的 libdispatch 错误 EVFILT_MACHPORT?
早上好,
我的应用程序面临崩溃。当用户尝试启动它时,他会等待一分钟,然后引发 std::exception。真的,我自己无法重现该错误,但这似乎是一个很常见的问题。
我唯一可以跟踪的是系统日志中的以下行:
libdispatch 客户端中的 BUG:在调用源取消处理程序之前,kevent[EVFILT_MACHPORT] 监控的资源消失了
然后,我开始用谷歌搜索它,我找不到更多......我只能“假设”这是GCD的一些问题(我不使用 afaik,或者至少不直接使用......)。我在互联网上看到的是它与 MacOSX Sierra 有关。但是大多数论坛都没有答案,只是尝试了很多,没有一个独特的结果。也许唯一一个似乎对解决方法有点清楚的网页(我没有测试过,无论如何我不想使用)是这个.
所以...:
- 有人清楚什么会导致 libdispatch 中的异常?
- 有人可以给我一些好的链接,官方文档或其他东西吗?
- 如果没有更新,这可能是 Sierra 中的错误,这是真的吗?
- 它可能与应用程序的安装程序有关吗?
- 有人知道用测试程序重现此异常的方法吗?
ios - 以下是 dispatch_set_target_queue() 的安全使用吗?
我的最终目标是使用队列作为NSOperationQueue的基础队列属性,因为 Apple 的文档明确声明不要使用 dispatch_get_main_queue()。尽管使用间接队列,但它在技术上遵循文档。
这一切的原因是因为NSOperationQueue.mainQueue 对于异步操作不是安全的,因为它是全局可访问的,并且它的maxConcurrentOperationCount 设置为 1。所以可以很容易地用这个操作队列来打自己的脚。
更新 1
关于这个问题假设“异步 NSOperation”是什么的基础,似乎有很多困惑。需要明确的是,这是基于此WWDC 会话中的概念。特定概念是使用“操作就绪”和依赖管理来管理应用程序中的任务,这意味着将异步 NSOperations 添加到 NSOperationQueues 以利用这一点。如果您将这些概念与这个问题的精神相结合,希望推理会更有意义,并且您可以专注于将解决方案与其他解决方案进行比较和对比。
更新 2 - 问题示例:
更新 3 - 示例 2:
我没有展示 MyAsyncBlockOperation 的实现,但您可以将其用作它在 Swift 中的基础。
所以我想,为什么不用另一个 NSOperationQueue 呢?一个将其底层队列设置为前面提到的间接GCD 队列(仍然遵循文档)。所以我们可以有一个并发的 NSOperationQueue,合法地针对串行主GCD 队列,并最终确保操作在主线程上运行。
如果您需要澄清,请告诉我,这是完整代码的示例:
现在......有一个安全的操作队列,用于需要在主线程上运行的异步操作,并且没有任何不必要的上下文切换。
安全吗?
ios - 为什么 NSOperationQueue.mainQueue.maxConcurrentOperationCount 设置为 1
这个问题的原因是因为对这个问题的反应。
我意识到对问题的理解并不完全存在,以及首先提出问题的原因。所以我试图将另一个问题的原因归结为这个问题的核心。
首先是一些前言,以及一些历史,我知道 NSOperation(Queue) 在 GCD 之前就存在,并且它们是在调度队列之前使用线程实现的。
接下来需要了解的是,默认情况下,这意味着在操作或操作队列上不使用“等待”方法(只是标准的“addOperation:”),NSOperation 的主要方法在 NSOperationQueue 的底层队列上执行异步(例如 dispatch_async())。
总结一下我的前言,我质疑在这个时代将 NSOperationQueue.mainQueue.maxConcurrentOperationCount 设置为 1 的目的,因为现在底层队列实际上是主要的 GCD 串行队列(例如 dispatch_get_main_queue() 的返回)。
如果 NSOperationQueue.mainQueue 已经连续执行了它的操作的主要方法,为什么还要担心 maxConcurrentOperationCount 呢?
要查看将其设置为 1 的问题,请参阅引用问题中的示例。
macos - 对于 libdispatch,dispatch_data_apply 中的偏移变量有什么意义?
我无法理解为 dispatch_io_read 函数调用提供给数据应用程序的偏移量变量。我看到文档声称偏移量是与数据对象基础的逻辑偏移量。查看 dispatch_data_apply 函数的源代码可以确认,对于第一次申请数据块,该变量总是从 0 开始,然后只是范围长度的总和。
我想我不明白这个变量的目的。我最初认为这是整个读取的偏移量,但事实并非如此。看来您必须跟踪读取的字节数和该数量的偏移量才能真正正确地在 libdispatch 中进行读取。
我的问题是:这是使用 dispatch_data_apply 返回的数据的正确方法吗?如果是这样,传递给应用程序处理程序的偏移变量的目的是什么?对我来说,文档似乎并不清楚。
macos - NSPrintOperation 附件视图中的 NSScrollView 无法正确滚动
在我的应用程序开始打印之前我必须做一些处理,所以我在一个线程上做,一旦完成,我做
一切正常,除了附件视图中的 NSScrollView(包装 NSTableView)。
使用连接到 Mac 的常规有线 PC 鼠标时,该视图可以完美滚动,但使用 Apple 触控板(MacBook 或外部触控板)和两指滚动时,除非您将手指从触控板上移开,否则滚动视图不会更新。
似乎某种触摸移动事件没有被传递。
如果我将块中的最后一行从-runOperation
更改-runOperationModalForWindow:delegate:didRunSelector:contextInfo:
为再次滚动就可以了,但是我真的没有窗口,我可以在我的用例中显示此工作表。
如果我直接调用任一 runOperation 方法而不是进行线程化,则滚动视图滚动良好。
swift - 如何在 ARM (Raspberry Pi) 上运行 swift 和 libDispatch
目的是在 Raspberry Pi 3 上运行 swift 和 libDispatch。我使用的是 Ubuntu Core 16.04
我在哪里:我试图让 SR-397 ( https://bugs.swift.org/browse/SR-397 ) 编译 - 这是一个最小的 Swift libDispatch 示例。此 SR 的项目在这里:https ://github.com/sheffler/gcd4和这里:https ://github.com/sheffler/CDispatch
当我尝试编译 gcd4 项目时,我收到此错误:“错误:不再支持空清单文件。用于swift package init
自动生成。” 我认为错误消息是由于空的 Package.swift 文件引起的,所以我将 Sheffler CDispatch 项目复制到https://github.com/tree700/CDispatch并添加了一个 Package.swift 文件。我仍然遇到同样的错误,并且无法克服它。
作为背景,我使用从https://github.com/uraimo/buildSwiftOnARM预编译的 Swift 3.1.1 下载,并在我的系统上安装了 Ubuntu libdispatch0 和 libdispatch-dev 包和依赖项。swift 编译器和 Swift 包管理器工作正常,
我很想实现这一点,我在 OS X 上使用 Dispatch,它让并发变得轻而易举。谢谢
ios - 我可以在我的 xcode 上构建 libdispatch 吗?
我想知道 GCD 在 iOS 上是如何工作的。然后我从 opensource.apple.com 下载了 libdispatch-913.30.4,但我不知道如何在我的 Xocde 上构建和调试它,它有很多错误。
install.md说我可以用上面的代码构建它:
但我得到这个错误
那么谁能帮助我呢?