【问题标题】:How to run CFSocket on a background thread for more accurate ping time?如何在后台线程上运行 CFSocket 以获得更准确的 ping 时间?
【发布时间】:2016-07-25 15:22:34
【问题描述】:

背景...

我正在修改 Apple 的 SimplePing 示例,以便为 iPhone 应用程序执行 ICMP ping。代码将本机套接字包装在指定读取回调的 CFSocket 对象中,然后将其添加为主线程上的运行循环源。当数据包被发送到套接字时,调用回调来计时往返、验证内容、更新 UI 等。

问题...

将此处理移至后台线程以使 ping 时间尽可能准确的最佳方法是什么?我需要测量调用套接字“sendto”方法和不间断地调用回调之间的精确时间。

任何示例或伪代码都会非常有帮助。我已经阅读了很多关于 Cocoa 中的线程的文章(NSThread 与 NSOperation、NSRunLoop 等),但到目前为止,我还不能完全拼凑起来。

谢谢

【问题讨论】:

  • 根据this post 的说法,CFSocket 引擎盖线程方面已经发生了很多事情。可能对你有用。
  • 澄清一下……想要进行后台处理的原因是原始代码(在主线程的 CFRunLoop 上运行)的 ping 时间比预期的要长。
  • @zoul:谢谢。我看过那个帖子,但我会再读一遍。

标签: iphone objective-c multithreading cocoa-touch sockets


【解决方案1】:

您需要支持 iOS 3.x 吗?如果没有,您可以考虑使用 Grand Central Dispatch;在这种情况下,您可以将套接字指定为调度队列的源并为其赋予最高优先级。

【讨论】:

  • 不幸的是,我确实需要支持 iOS 3.x,所以 GCD 不是一个选项。这是我现在正在尝试的:我正在使用 NSThread 的 detachNewThreadSelector:toTarget:withObject: 方法来调用我现有的方法,该方法将 CFSocket 设置为 CFRunLoop 上的源(现在将是新线程的运行循环)。我在正确的轨道上吗?
  • 问题中提到,有没有代码示例?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
相关资源
最近更新 更多