87 votes

Comment mettre en veille pendant quelques millisecondes dans swift 2.2 ?

Quelqu'un peut-il me dire comment utiliser sleep() pour quelques millisecondes dans swift 2.2 ?

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

mais

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

cela fonctionne.

1 votes

Le thread sleep ou yield est valable dans le cas du polling, par exemple. De nombreuses interfaces ne proposent pas de notifications. Vous devez donc vérifier de temps en temps si un changement asynchrone est imminent. Si vous le faites sans mettre le thread en pause entre les vérifications, vous harcelez inutilement le CPU et bloquez probablement le processus que vous attendez.

1 votes

Sleep() prend int comme paramètre. Ainsi, sleep(0.002) fera dormir 0 seconde. Utilisez plutôt usleep(nanosecondes).

0 votes

Pour ceux qui souhaitent utiliser les fonctions async & await de Swift 5.5, voir este réponse d'un autre poste.

153voto

Harris Points 916

Usleep() prend des millionièmes de seconde

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

OU

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

OU

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

0 votes

UInt32(0.002) est 0. On devrait lire usleep(UInt32(0.002 * second))

18voto

Philip Points 2043

Je pense que plus élégant que usleep la solution dans la syntaxe actuelle de swift est : Thread.sleep(forTimeInterval: 0.002)

10voto

user3441734 Points 7396

Utiliser func usleep(_: useconds_t) -> Int32 (importation Darwin o Foundation ...)

3 votes

Usleep() prend des millionièmes de seconde, donc usleep(1000000) dormira pendant 1 sec.

4voto

eonist Points 1748

Solution non bloquante pour le sommeil :

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
    }
}

4voto

rocket101 Points 540

Si vous avez vraiment besoin de dormir, essayez usleep comme suggéré dans la réponse de @user3441734.

Cependant, vous pouvez vous demander si la mise en veille est la meilleure option : c'est comme un bouton de pause, et l'application sera gelée et ne répondra pas pendant qu'elle fonctionne.

Vous pouvez utiliser 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
}

0 votes

Parfois, c'est une bonne idée de mettre en pause une tâche d'arrière-plan pendant un certain temps ... et sleep et usleep pourraient être très utiles, faciles à adopter et peu coûteux. malheureusement, il est très rare de voir l'utilisation correcte de sleep ou usleep. généralement, il vaut mieux l'éviter :-)

0 votes

Cela ne figerait l'application que si vous mettiez en pause le fil d'événement, ce qui est toujours une mauvaise idée. Le travail autre que l'interface utilisateur devrait être effectué hors de ce thread de toute façon. L'utilisation normale de usleep ne fait que bloquer le thread actuel.

0 votes

Eh, c'est plus probablement un mauvais signe si vous appelez usleep dans une partie de haut niveau de votre application. Il peut bloquer les files d'attente GCD, par exemple. A n'utiliser que si les abstractions fournies par Apple vraiment ne sont pas adaptés à ce que vous devez faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X