问题标签 [cfrunloop]

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 回答
345 浏览

iphone - iPhone后台线程中的模态警报

在我的 iPhone 应用程序中,主线程创建了一个后台线程,它做了很多工作,在某些情况下需要询问用户他们的决定。当用户被问到问题时,后台线程应该停止工作,只有在用户回答问题后才能继续。

最好的方法是什么?

PS
我试过 iPhone Developer's Cookbook 中的 ModalAlert,据说可以解决问题,但我没有成功。似乎 CFRunLoopRun (应该停止线程执行)只是不会停止后台线程。

我有这样的代码

并且在线程NSLog启动后立即执行。syncStart奇怪的。

0 投票
1 回答
8735 浏览

macos - CFRunLoopRun() 与 [NSRunLoop 运行]

我有一个 NSRunLoop 对象,我将计时器和流附加到该对象。它工作得很好。停止它是另一个故事。

我使用[runLoop run].

如果我尝试使用 停止循环CRunLoopStop([[NSRunLoop currentRunLoop] getCFRunLoop]),则循环不会停止。如果我改为使用开始循环CRunLoopRun(),它会起作用。我还确保调用是在正确的线程(运行我的自定义运行循环的线程)上进行的。我已经用pthread_self().

CRunLoopStop()我找到了一个邮件列表存档,其中一位开发人员说“如果您使用 run 方法启动循环,请不要打扰使用NSRunLoop”。我可以理解为什么会这样——你通常将初始化器和终结器从同一组函数中配对。

你如何阻止一个NSRunLoop没有“诉诸CF”的人?我没有stopNSRunLoop. 文档说您可以通过三种方式停止运行循环:

  1. 配置运行循环以使用超时值运行
  2. 告诉运行循环停止使用CFRunLoopStop()
  3. 移除所有输入源,但这是停止运行循环的一种不可靠的方法,因为你永远无法知道是什么东西卡在了你背后的运行循环中

好吧,我已经尝试了 2。它有一种“丑陋”的感觉,因为你必须深入研究 CF。3. 不可能——我不喜欢非确定性代码。

这给我们留下了 1。如果我正确理解了这些文档,您就不能将超时“添加”到已经存在的运行循环中。您只能在超时的情况下运行新的运行循环。如果我运行一个新的运行循环,它不会解决我的问题,因为它只会创建一个嵌套的运行循环。我还是会回到旧的,我想停下来……对吧?我可能误解了这一点。另外,我不想使用超时值运行循环。如果我这样做了,我将不得不在消耗 CPU 周期(低超时值)和响应能力(高超时值)之间进行权衡。

这是我现在的设置(伪代码):

通讯器.h

Communicator.m

我是什么做的?弄乱 CF 是常见的/好的模式吗?我对基金会不够了解。干扰 CF 层是否可能是危险的(关于内存损坏、不一致、内存泄漏)?是否有更好的模式来实现我想要实现的目标?

0 投票
3 回答
2236 浏览

iphone - 为什么 CFRunLoopRun 不起作用?

鉴于前面的代码,你知道为什么CFRunLoopRun()不起作用吗?我需要regFun在后台打电话。

还有其他方法可以停止后台线程吗?

0 投票
0 回答
574 浏览

pthreads - 我可以在 pthread 创建的 threadFunction 中使用 CFRunloop 机制吗?

由于某种原因,我不能使用 NSThread。但我认为在 2 个线程之间使用 CFRunloopSource 的通信方式很方便。所以我想知道是否可以在pthread创建的线程上下文中获取当前的cfrunloop ref?

我上网查了一下,确实看到了一些评论,即使使用 pthread,runloop ref 仍然可用。但我没有从文档中看到任何关于此的内容。所以想请教一下这里有相关经验的人。

此外,我可以通过新线程和当前线程之间的 CFRetain(CFRunLoopGetCurrent()) 共享从新线程检索到的 CFRunloopRef 吗?因为当我想通过 CFRunLoopWakeUp(ref) 在新创建的线程中触发 runloop 时需要 ref

谢谢,

杰克塞拉夫

0 投票
1 回答
1805 浏览

objective-c - NSRunLoop 正在消耗大量的 cpu 和内存

我有一个无限循环来驱动我的工作线程。

但有时这些线程会占用大量 CPU(50-100%)和内存(1.5GB)。当我在这种状态下对应用程序进行采样时,我得到了以下跟踪

谁能帮帮我?

0 投票
1 回答
805 浏览

ios - NSTimer v/s CFRunLoopTimer

我的问题是哪个更好用?

由于NSTimer反过来使用CFRunLoopTimer对象。什么比其他更好,我在我搜索过的任何网站上都没有得到任何关于它的信息,但什么也没有,我从Apple 的文件中获得了关于这两个文件的文件,但在阅读它们后,我不理解或不清楚what to use NSTimer or CFRunLoopTimer? 任何帮助将不胜感激。

0 投票
2 回答
1384 浏览

ios - CFRunLoopWakeUp 不起作用?

我有一个似乎CFRunLoopWakeUp不起作用的案例。这是设置:

我有一个“典型的”while循环不在等待一些工作完成的主线程上:

我有一个回调函数等待某些工作完成。这也不是从主线程调用的:

回调被调用,但由于某种原因,CFRunLoopWakeUp似乎没有做任何事情。我错过了一些明显的东西吗?这里有一些深线程问题吗?谢谢!

0 投票
1 回答
1570 浏览

c# - 尝试编译调用本机代码的类时,Mono 编译器崩溃

我有以下类,它使用 Mono(在 Mac 中)将一些运行循环调用从本机代码映射到 C#,并且编译器无法正常工作,它在尝试编译时总是崩溃。我已将其删除到仅包含此类的单独项目中,但它仍然损坏,因此问题似乎与此代码有关。

有没有人见过这样的事情?

编译器输出如下:

构建解决方案:calling-native-code-mono(调试)

构建:calling-native-code-mono (Debug) 执行主编译... /Library/Frameworks/Mono.framework/Versions/2.10.9/bin/dmcs /noconfig "/out:/Users/mauricio/Projects/calling -native-code-mono/bin/Debug/calling-native-code-mono.dll" "/r:/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/4.0/System.dll" "/r:/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/4.0/System.Core.dll" /nologo /warn:4 /debug:full /optimize- /codepage:utf8 "/定义:调试”/t:library“/Users/mauricio/Projects/calling-native-code-mono/CommonRunLoop.cs”“/Users/mauricio/Projects/calling-native-code-mono/AssemblyInfo.cs”

未处理的异常:System.NullReferenceException:对象引用未设置为 Mono.CSharp.EmitContext.Emit 处的对象实例(OpCode 操作码,Mono.CSharp.MethodSpec 方法)[0x00000] 在:0 在 Mono.CSharp.New.Emit (Mono.CSharp.EmitContext ec,IMemoryLocation 目标)[0x00000] 在:0 在 Mono.CSharp.VariableReference.EmitAssign(Mono.CSharp.EmitContext ec,Mono.CSharp.Expression 源,布尔值 leave_copy,布尔值 prepare_for_load)[0x00000] 在:0 在 Mono.CSharp.Assign.Emit (Mono.CSharp.EmitContext ec, Boolean is_statement) [0x00000] 在 :0 在 Mono.CSharp.Assign.EmitStatement (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在Mono.CSharp.BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono。CSharp.Block.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.ExplicitBlock.Emit ( Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Constructor.Emit () [0x00000] 在: 0
在 Mono.CSharp.TypeContainer.EmitType () [0x00000] in :0 在 Mono.CSharp.ModuleContainer.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.0 .CSharp.Driver.Compile () [0x00000] in :0 at Mono.CSharp.Driver.Main (System.String[] args) [0x00000] in :0 [ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not在 Mono.CSharp.New.Emit (Mono.CSharp.EmitContext ec, IMemoryLocation 目标的 Mono.CSharp.New.Emit (Mono.CSharp.EmitContext ec, IMemoryLocation target ) [0x00000] 在:0 在 Mono.CSharp.VariableReference.EmitAssign (Mono.CSharp.EmitContext ec,Mono.CSharp.Expression 源,布尔值 leave_copy,布尔值 prepare_for_load) [0x00000] 在:0 在 Mono.CSharp.Assign.Emit (Mono.CSharp。EmitContext ec, Boolean is_statement) [0x00000] 在:0 在 Mono.CSharp.Assign.EmitStatement (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Block.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock .Emit (Mono.CSharp.EmitContext ec) [0x00000] in :0 在 Mono.CSharp.Constructor.Emit () [0x00000] in :0BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.Block.DoEmit (Mono. CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [ 0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Constructor.Emit () [0x00000] 在:0BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.Block.DoEmit (Mono. CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [ 0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Constructor.Emit () [0x00000] 在:00 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp。 Constructor.Emit() [0x00000] in :00 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp。 Constructor.Emit() [0x00000] in :0
在 Mono.CSharp.TypeContainer.EmitType () [0x00000] in :0 在 Mono.CSharp.ModuleContainer.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.0 .CSharp.Driver.Compile () [0x00000] in :0 在 Mono.CSharp.Driver.Main (System.String[] args) [0x00000] in :0

未处理的异常:System.NullReferenceException:对象引用未设置为 Mono.CSharp.EmitContext.Emit 处的对象实例(OpCode 操作码,Mono.CSharp.MethodSpec 方法)[0x00000] 在:0 在 Mono.CSharp.New.Emit (Mono.CSharp.EmitContext ec,IMemoryLocation 目标)[0x00000] 在:0 在 Mono.CSharp.VariableReference.EmitAssign(Mono.CSharp.EmitContext ec,Mono.CSharp.Expression 源,布尔值 leave_copy,布尔值 prepare_for_load)[0x00000] 在:0 在 Mono.CSharp.Assign.Emit (Mono.CSharp.EmitContext ec, Boolean is_statement) [0x00000] 在 :0 在 Mono.CSharp.Assign.EmitStatement (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在Mono.CSharp.BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono。CSharp.Block.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.ExplicitBlock.Emit ( Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Constructor.Emit () [0x00000] 在: 0
在 Mono.CSharp.TypeContainer.EmitType () [0x00000] in :0 在 Mono.CSharp.ModuleContainer.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.0 .CSharp.Driver.Compile () [0x00000] in :0 at Mono.CSharp.Driver.Main (System.String[] args) [0x00000] in :0 [ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not在 Mono.CSharp.New.Emit (Mono.CSharp.EmitContext ec, IMemoryLocation 目标的 Mono.CSharp.New.Emit (Mono.CSharp.EmitContext ec, IMemoryLocation target ) [0x00000] 在:0 在 Mono.CSharp.VariableReference.EmitAssign (Mono.CSharp.EmitContext ec,Mono.CSharp.Expression 源,布尔值 leave_copy,布尔值 prepare_for_load) [0x00000] 在:0 在 Mono.CSharp.Assign.Emit (Mono.CSharp。EmitContext ec, Boolean is_statement) [0x00000] 在:0 在 Mono.CSharp.Assign.EmitStatement (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Block.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock .Emit (Mono.CSharp.EmitContext ec) [0x00000] in :0 在 Mono.CSharp.Constructor.Emit () [0x00000] in :0BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.Block.DoEmit (Mono. CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [ 0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Constructor.Emit () [0x00000] 在:0BlockVariableDeclaration.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在 :0 在 Mono.CSharp.Block.DoEmit (Mono. CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [ 0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.Constructor.Emit () [0x00000] 在:00 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp。 Constructor.Emit() [0x00000] in :00 在 Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] 在:0 在 Mono.CSharp。 Constructor.Emit() [0x00000] in :0
在 Mono.CSharp.TypeContainer.EmitType () [0x00000] in :0 在 Mono.CSharp.ModuleContainer.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.CSharp.AssemblyDefinition.Emit () [0x00000] 在 Mono.0 .CSharp.Driver.Compile () [0x00000] in :0 at Mono.CSharp.Driver.Main (System.String[] args) [0x00000] in :0 构建完成 -- 1 个错误,0 个警告

- - - - - - - - - - - 完毕 - - - - - - - - - - -

构建:1 个错误,0 个警告

0 投票
2 回答
5590 浏览

objective-c - iOS:CFRunLoopRun() 函数混淆

我读过关于 CFRunLoop 但仍然有点困惑。我遇到了一段我想为自己澄清的代码:

那么,假设这一切都在主线程上调用,它会阻塞主线程吗?还是会通过 CFRunLoopRun() 函数调用产生一个新线程?

谢谢!

0 投票
0 回答
738 浏览

macos - 如何使用 Core Foundation 消息端口在运行循环源之间进行通信

我有以下代码,我尝试在其中创建一个消息端口,用于两个运行循环之间的通信。1个运行循环正在执行而不是pthread,另一个是主运行循环。此功能似乎在许多不同的条件下正常运行,但是,它们都不是所需的条件。

例如,传递 NULL 而不是 kCFRunLoopDefaultMode 可以工作,但不会阻塞。

为sndData和 MessagePortProc 回调(返回 NULL)的返回值传递 kCFRunLoopDefaultMode 和 NULL 数据也按预期工作,唯一的问题是我需要从 MessagePortProc 回调发送和返回数据,因此使用消息端口。

如果使用 kCFRunLoopDefaultMode 并且 MessagePortProc 返回值或 sndData 参数不是 NULL CFMessagePortSendRequest 块并且永远不会返回。MessagePortProc 被调用得很好,它只是永远不会将控制权返回到调用它的位置。没有打印错误消息,没有发生崩溃,它只是坐在那里。

我正在使用从下面概述的小字节数组创建的简单 CFDataRef 用于发送和接收数据作为测试用例。任何一个都会导致概述的行为。