问题标签 [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.

0 投票
1 回答
804 浏览

linux - 使用 Ansible 在 Linux 上安装 Swift 3 + libdispatch

我正在努力在 Ubuntu 16.04 上安装 Swift 3.0 和 GCD。这在今天应该是可能的,对吧?

下面是一个 Ansible 任务,用于从 swift.org 下载 Swift 3,从 GitHub 克隆、构建和安装 swift-corelibs-libdispatch。

即使 libdispatch 的安装完成且没有错误,它也不起作用。当我尝试使用import DispatchSwift repl 时,它抱怨缺少功能“块”。检查 Makefile 确认,至少标志-fblocks已提供给编译器。

这是 Swift repl 的示例输出:

用于设置盒子的 Vagrantfile:

安装 Swift 3 的 Ansible 任务:

0 投票
0 回答
149 浏览

c - libdispatch-dev SIGILL,dispatch_release 中的非法指令

我有一个在 Ubuntu linux 中使用 libdispatch 的程序。在我的主函数结束时,我有 dispatch_main() 来保持主线程挂起。我的程序的其余部分按预期运行,但由于某种原因,一旦最后调用 dispatch_main,它就会以 SIGILL 退出。运行 GDB,下面是输出。最后的回溯显示它在 dispatch_release 失败。

程序:

gdb 调试:

0 投票
1 回答
188 浏览

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_tasInt而不是UInt. 它归结为“更少的类型转换,并且无论如何谁需要指定高于 2^63 的数字(对不起,32 位平台)。” 很公平,但这并不包括像我这样的问题,其中使用SIZE_MAX是 API 的一部分。

0 投票
1 回答
4440 浏览

c++ - 是什么导致 MacOSX Sierra 中的 libdispatch 错误 EVFILT_MACHPORT?

早上好,

我的应用程序面临崩溃。当用户尝试启动它时,他会等待一分钟,然后引发 std::exception。真的,我自己无法重现该错误,但这似乎是一个很常见的问题。

我唯一可以跟踪的是系统日志中的以下行:

libdispatch 客户端中的 BUG:在调用源取消处理程序之前,kevent[EVFILT_MACHPORT] 监控的资源消失了

然后,我开始用谷歌搜索它,我找不到更多......我只能“假设”这是GCD的一些问题(我不使用 afaik,或者至少不直接使用......)。我在互联网上看到的是它与 MacOSX Sierra 有关。但是大多数论坛都没有答案,只是尝试了很多,没有一个独特的结果。也许唯一一个似乎对解决方法有点清楚的网页(我没有测试过,无论如何我不想使用)是这个.

所以...:

  • 有人清楚什么会导致 libdispatch 中的异常?
  • 有人可以给我一些好的链接,官方文档或其他东西吗?
  • 如果没有更新,这可能是 Sierra 中的错误,这是真的吗?
  • 它可能与应用程序的安装程序有关吗?
  • 有人知道用测试程序重现此异常的方法吗?
0 投票
2 回答
509 浏览

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 队列,并最终确保操作在主线程上运行。

如果您需要澄清,请告诉我,这是完整代码的示例:

现在......有一个安全的操作队列,用于需要在主线程上运行的异步操作,并且没有任何不必要的上下文切换

安全吗?

0 投票
1 回答
756 浏览

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 的问题,请参阅引用问题中的示例。

0 投票
1 回答
162 浏览

macos - 对于 libdispatch,dispatch_data_apply 中的偏移变量有什么意义?

我无法理解为 dispatch_io_read 函数调用提供给数据应用程序的偏移量变量。我看到文档声称偏移量是与数据对象基础的逻辑偏移量。查看 dispatch_data_apply 函数的源代码可以确认,对于第一次申请数据块,该变量总是从 0 开始,然后只是范围长度的总和。

我想我不明白这个变量的目的。我最初认为这是整个读取的偏移量,但事实并非如此。看来您必须跟踪读取的字节数和该数量的偏移量才能真正正确地在 libdispatch 中进行读取。

我的问题是:这是使用 dispatch_data_apply 返回的数据的正确方法吗?如果是这样,传递给应用程序处理程序的偏移变量的目的是什么?对我来说,文档似乎并不清楚。

0 投票
1 回答
143 浏览

macos - NSPrintOperation 附件视图中的 NSScrollView 无法正确滚动

在我的应用程序开始打印之前我必须做一些处理,所以我在一个线程上做,一旦完成,我做

一切正常,除了附件视图中的 NSScrollView(包装 NSTableView)。

使用连接到 Mac 的常规有线 PC 鼠标时,该视图可以完美滚动,但使用 Apple 触控板(MacBook 或外部触控板)和两指滚动时,除非您将手指从触控板上移开,否则滚动视图不会更新。

似乎某种触摸移动事件没有被传递。

如果我将块中的最后一行从-runOperation更改-runOperationModalForWindow:delegate:didRunSelector:contextInfo:为再次滚动就可以了,但是我真的没有窗口,我可以在我的用例中显示此工作表。

如果我直接调用任一 runOperation 方法而不是进行线程化,则滚动视图滚动良好。

0 投票
1 回答
322 浏览

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,它让并发变得轻而易举。谢谢

0 投票
0 回答
195 浏览

ios - 我可以在我的 xcode 上构建 libdispatch 吗?

我想知道 GCD 在 iOS 上是如何工作的。然后我从 opensource.apple.com 下载了 libdispatch-913.30.4,但我不知道如何在我的 Xocde 上构建和调试它,它有很多错误。

install.md说我可以用上面的代码构建它:

但我得到这个错误

那么谁能帮助我呢?