【问题标题】:How to sleep for few milliseconds in swift 2.2?如何在 swift 2.2 中睡几毫秒?
【发布时间】:2016-11-02 08:24:52
【问题描述】:

请任何人告诉我如何在 swift 2.2 中使用 sleep() 几毫秒?

while (true){
    print("sleep for 0.002 seconds.")
    sleep(0.002) // not working
}

但是

while (true){
    print("sleep for 2 seconds.")
    sleep(2) // working
}

它正在工作。

【问题讨论】:

  • 线程休眠或yield在轮询的情况下有效,一。许多界面不提供通知,因此您必须经常检查即将发生的异步更改。在检查之间不暂停线程的情况下执行此操作将不必要地骚扰 CPU 并可能阻塞您正在等待的进程。
  • sleep() 将 int 作为参数。所以 sleep(0.002) 会休眠 0 秒。改用 usleep(nanoseconds)
  • 对于那些想要使用 Swift 5.5 的 async 和 await 睡眠的人,请参阅另一篇帖子的 this 回答。

标签: swift uikit sleep


【解决方案1】:

usleep() 需要百万分之一秒

usleep(1000000) //will sleep for 1 second
usleep(2000) //will sleep for .002 seconds

 let ms = 1000
 usleep(useconds_t(2 * ms)) //will sleep for 2 milliseconds (.002 seconds)

let second: Double = 1000000
usleep(useconds_t(0.002 * second)) //will sleep for 2 milliseconds (.002 seconds)

【讨论】:

  • UInt32(0.002) 为 0。应为 usleep(UInt32(0.002 * second))
【解决方案2】:

使用func usleep(_: useconds_t) -> Int32(导入DarwinFoundation ...)

【讨论】:

  • usleep() 需要百万分之一秒,所以 usleep(1000000) 会休眠 1 秒
【解决方案3】:

我认为当前 swift 语法中比 usleep 更优雅的解决方案是: Thread.sleep(forTimeInterval: 0.002)

【讨论】:

    【解决方案4】:

    如果您真的需要睡觉,请尝试usleep@user3441734 的答案中的建议。

    但是,您可能希望考虑睡眠是否是最佳选择:它就像一个暂停按钮,应用程序在运行时将被冻结且无响应。

    您不妨使用NSTimer

     //Declare the timer
     var timer = NSTimer.scheduledTimerWithTimeInterval(0.002, target: self, selector: #selector(MyClass.update), userInfo: nil, repeats: true)
     self, selector: "update", userInfo: nil, repeats: true)
    
    
    
    func update() {
        // Code here
    }
    

    【讨论】:

    • 有时将一些后台任务“暂停”一段时间是个好主意……而 sleep 和 usleep 可能是非常有用、易于采用且成本低廉的解决方案。不幸的是,很少看到正确使用 sleep 或 usleep。一般来说,最好避免它:-)
    • 如果你暂停了事件线程,它只会冻结应用程序,这总是一个糟糕的主意。无论如何,除了 UI 之外的工作都应该在该线程上完成。正常使用usleep只会导致当前线程阻塞。
    • 呃,如果您在应用程序的高级部分调用 usleep,这很可能是一个不好的信号。一方面,它可以阻止 GCD 队列。仅当 Apple 提供的抽象真的不适合您需要做的事情时才使用。
    【解决方案5】:

    usleep 的非阻塞解决方案:

    DispatchQueue.global(qos: .background).async {
        let second: Double = 1000000
        usleep(useconds_t(0.002 * second)) 
        print("Active after 0.002 sec, and doesn't block main")
        DispatchQueue.main.async{
            //do stuff in the main thread here
        }
    }
    

    【讨论】:

      【解决方案6】:

      或者:

      DispatchQueue.main.asyncAfter(deadline: .now() + 0.002) {
         /*Do something after 0.002 seconds have passed*/
      }
      

      【讨论】:

      • 我没有深入了解它是如何工作的,但似乎在 Objective-C(和 Swift)中,这段代码每个 dTime 都会生成一个新线程,而不会破坏以前的线程。因此,在更好的情况下,您会浪费设备的内存,在最坏的情况下,应用程序会因大量内存消耗而崩溃(取决于循环次数)
      猜你喜欢
      • 2010-10-28
      • 2011-06-26
      • 2011-05-10
      • 2022-07-13
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多