问题标签 [runloop]
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.
macos - CFRunLoopRemoveSource 和 CFRunLoopSourceInvalidate 的区别
我在 Mac 上调试我的 HID 驱动程序代码中的崩溃,发现崩溃发生在 CFRunLoop 中。在驱动程序代码中,我打开与我的 HID 设备匹配的 VID 和 PID 的设备的 USB 句柄,然后使用 setInterruptReportHandlerCallback 函数为其设置中断回调,然后使用 CFRunLoopAddSource 调用将其添加到 CFRunLoop。在我调用关闭句柄时,我使用 CFRunLoopRemoveSource 释放它们,然后在 CFRunLoopSourceRef 上使用 CFRelease 。
当我尝试打开句柄等待一段时间(5ms)然后在循环中关闭句柄时会出现问题。
当我搜索问题时,我遇到了一个链接,在该链接中他们遇到了与我的http://lists.apple.com/archives/usb/.../msg00099.html类似的问题,他们使用 CFRunLoopSourceInvalidate 调用而不是删除源调用。当我在关闭句柄调用中将其更改为 Invalidate source 时,它修复了我的崩溃。我想知道崩溃之间有什么区别,为什么这个调用修复了我的崩溃?
感谢 jbsp72
cocoa - Cocoa 应用程序有主循环吗?
在 X11 下的 Linux 上并使用 GTK+,你有一个叫做“主循环”的东西。启动主循环后,您将拥有一个在应用程序的主线程中运行的计时器。您可以将该计时器设置为回调函数,并且您有一个非常好的应用程序范围的计时器。
这是示例代码:
我正在尝试为 Mac OS X 编写一个类似的应用程序,而不是主循环,我使用的是一个简单的计时器:
这似乎不太好用。计时器一直处于关闭状态。我也尝试过使用 NSTimer 但没有运气。我对objective-c 不是很熟悉,尤其是对GUI 应用程序。
无论如何,任何想法如何在 Cocoa (objective-c with Xcode) 上实现应用程序范围的计时器?
谢谢!
编辑 使用 NSTimer 时,这是我在运行时遇到的错误:
编辑 2
好,我知道了。问题是我没有向计时器添加“目标:”。现在,当我关闭计时器时,出现以下错误:
定时器的释放如下:
cocoa - 在可可中发布某些通知之前如何阻止?
睡觉/等到某些通知发布的最佳方法是什么?
我有一个带有异步 API 的类,可以从中获取数据NSNotification
(通知来自 Cocoa,我无法避免),我需要对其进行单元测试。
到目前为止,我已经弄清楚了半忙等待:
如果不处理运行循环通知,则不会收到。但是,当需要的通知到来时,我怎样才能立即从运行循环中中断呢?
iphone - 究竟什么在这里被称为“运行循环”?
在继续阅读文档之前,我的大脑在这一点上卡住了:
我在代码示例中添加了一些注释。也许有人可以解释一下,如果有一个 runLoop 对象接收到 -runUntilDate: 消息,为什么会有一个 while 循环。我的意思是:这里的循环是谁?我看到两个。首先 while 这显然是一个正在运行的循环,然后它调用一个听起来像是在运行一个循环的方法。
iphone - 如何创建仅由 performSelector... 方法调用踢的运行循环?
我有点搞乱线程。现在考虑一下:我有一个主线程。我开始一个新线程。在它的入口点方法中,我想创建一个运行循环。现在文档告诉我我必须有一个输入源。否则我的运行循环会立即退出。坏的。好的。但除了我的 performSelector... 方法调用之外,我没有其他输入源。线程启动后,会出现一个 performSelector 方法,该方法会在延迟一段时间后启动该线程上的另一个方法。在该方法内部发生另一个 performSelector 调用,依此类推。每个都有 0.1 到 1 秒的延迟。所以重复触发计时器是没有意义的;-)
我如何设置该运行循环,使其保持活动状态以接收来自 performSelector 的踢?我希望线程在无事可做时休眠。但是当一个 performSelector 踢到他的屁股时,我希望线程唤醒并工作。
任何建议,有人吗?
iphone - 将选择器排入运行循环 - [NSObject performSelector:withObject:afterDelay:] 是要走的路吗?
我希望在当前方法通过并且 UI 已更新后执行一个方法。为此,我现在正在使用[object performSelector:@selector(someSelector) withObject:someObject afterDelay:0.0]
。根据Apple 的文档,这会创建一个 NSTimer,然后它将触发选择器并将其附加到当前的 NSRunLoop。但我不认为这很优雅。有没有一种简单的方法可以将选择器直接排入当前运行循环,而无需 Cocoa 创建 Timer 等?
会performSelectorOnMainThread:withObject:waitUntilDone:
(如果我在主线程上)或者performSelector:onThread:withObject:waitUntilDone:
用waitUntilDone:NO
更少的开销做我想做的事?
提前欢呼和感谢
法师先生
iphone - 什么时候给 Cocoa 回调控件?
我一直在网上搜索这个问题的答案,但无法找到答案,另一方面,我认为这很常见,因此我可能在这里遗漏了一些关键字。无论如何,问题如下:
什么时候控制 ObjC (iPhone) 中的回调函数?
在将控制权交给负责运行循环的层次结构类中的高层之后是否会发生这种情况?它可以发生在正在执行的另一个函数调用的中间吗?
以NSURLConnection为例,我们不知道或无法预测它何时会调用didReceiveResponse或其他回调方法,会不会是当我在另一个函数中间时调用didReceiveResponse get 的情况? (高度怀疑,但无法找到有关等待运行循环结束的回调的信息)
干杯,卡斯帕
iphone - iPhone:如何在 CFRunLoop 中优先考虑项目(OpenGL 相关)
我有一个 OpenGL 应用程序,它渲染密集,还通过 HTTP 获取内容。
遵循 Apple 的 OpenGL 示例,我最初将 NSTimer 用于我的主要绘画循环,然后发现(像其他人一样)这确实不是一个好主意(因为当慢速绘画导致绘画时,有时处理触摸事件时会出现巨大延迟计时器堆积)。
所以目前我正在使用用户 godexsoft 在http://www.idevgames.com/forum/showthread.php?t=17058给出的策略(搜索 godexsoft 的帖子)。具体来说,我的渲染运行循环在主线程上,包含以下内容:
这条线允许在渲染帧之间发生触摸事件和与通信相关的事情等事件。它有效,但我想进一步完善它。有什么办法可以让触摸事件优先于其他事件(比如与通信相关的东西)?如果我能做到这一点,我可以减少 0.01f 数字并获得更好的帧速率。(我知道这可能意味着通讯需要更长的时间才能返回,但不滞后的触摸事件非常重要)。
iphone - iPhone - appDidBecomeActive: 和运行循环开始之间的数组丢失?
编辑:我在初始化后立即手动保留数组,并修复了它。杜尔。谢谢。
我在 UIScrollView 子类中保留一个 NSMutableArray,并在其中添加 UIImageView 子类的实例,因为每个实例都作为子视图添加。它需要是一个可变数组,因为我计划最终重新排列它们在数组中的顺序;在我尝试这样做之前,这个错误就已经发生了。我已经使用 NSLogs 来显示该数组的计数为 10,直到并包括在我的 AppDelegate 中调用 applicationDidBecomeActive:,并添加了一个计时器以在运行循环中每 0.001 秒触发一次。第一次开火,就再也找不到阵法了!我很困惑,几个小时以来一直试图追踪这个问题。
计时器工作正常(即当 printCount: 不访问数组时,这很好),只有当我尝试访问那里的数组时它才会中断。对 printCount: 的常规调用有效,但第一次触发计时器时 I 这两个对 printCount: 的调用之间可能发生什么?
我一直在用调试器无休止地单步执行程序。到目前为止,数组是正确的,即使在其内容更改后,它的内存地址也是相同的。然而,之后只有一个对象——它的 10 个元素被一个 UITouchData 实例替换。不知道它来自哪里。我的所有事件处理方法都不会尝试重新分配或更改数组。有什么想法可能会出错吗?我完全迷惑了。
iphone - 在线程上运行 NSTimer
我正在尝试使用 iPhone SDK 3.0 在线程上运行 NSTimer。我认为我做的一切都是正确的(新的运行循环等)。如果我在 viewDidDissappear 上调用 [timer invalidate] 虽然我收到此错误:
bool _WebTryThreadLock(bool), 0x3986d60: 试图从主线程或web线程以外的线程获取web lock。这可能是从辅助线程调用 UIKit 的结果。现在崩溃... 程序接收到信号:“EXC_BAD_ACCESS”。
这是我的代码:
当我删除使计时器无效的行时,一切正常。我不应该使它无效还是我犯了其他错误?
谢谢