Meilleure façon de faire de script lua attendre/pause/sommeil/bloquer pendant quelques secondes?
Je ne peux pas comprendre comment obtenir lua pour faire toute la commune timing trucs, comme
-
sommeil - arrêter toute action sur le thread
-
pause/wait - ne pas aller à la prochaine
de commande, mais de permettre à d'autres de code dans le
demande de continuer -
bloc - ne passez pas à côté de la commande jusqu'à la
actuel renvoie
Et j'ai lu qu'un
while os.clock()<time_point do
--nothing
end
mange de temps CPU.
Des suggestions? Est-il un appel d'API je suis absent?
Mise à JOUR: j'ai écrit cette question il y a longtemps à essayer d'obtenir WOW Lua pour la relecture des actions sur le temps (c'est à dire debout, attendre 1 sec, de la danse, attendre 2 sec, s'asseoir. Sans pause, cela n'arrive presque tous dans le même quart de seconde.) Il s'est avéré que WOW avait volontairement désactivé peu près tout ce qui permet de faire une action sur une horloge, car il pourrait se briser, le jeu ou permettre à des robots. J'ai pensé à re-créer une horloge une fois qu'il avait été emporté, j'aurais du faire quelque chose de fou, comme créer un tableau (avec une action et de temps d'exécution), puis d'enregistrer un gestionnaire d'événement sur un tas d'activités courantes, comme le déplacement de la souris, puis dans le même gestionnaire, processus de toute action dont le temps était venu. Le gestionnaire d'événement ne serait pas effectivement se produire toutes les X millisecondes, mais si c'était le cas tous les 2-100 ms, il serait assez proche. Malheureusement, je n'ai jamais essayé.
Vous devez vous connecter pour publier un commentaire.
Qu'il ne soit pas plus facile que cela. Le sommeil peut être mis en œuvre dans votre FLTK, ou que ce soit, mais cela couvre tous les meilleures façons de le faire tri standard de système dort sans événement spécial interruptions. Voici:
[J'allais à la poste comme un commentaire sur Jean-Cromartie est post, mais ne le savais pas, tu ne pouvais pas utiliser la mise en forme dans un commentaire.]
Je suis d'accord. Déposer dans un shell avec les os.execute() sera certainement le travail mais en général, la prise de shell appels est cher. Emballage code C sera beaucoup plus rapide à l'exécution. En C/C++ sur un système Linux, vous pouvez utiliser:
Puis, en principal, faites:
où "L" est votre lua_State. Puis, dans votre script Lua appelé à partir de C/C++, vous pouvez utiliser votre fonction en appelant le:
Si vous arrive d'utiliser LuaSocket dans votre projet, ou tout simplement avoir installé et n'hésitent pas à l'utiliser, vous pouvez utiliser le
socket.sommeil(temps)
fonction qui dort pour un montant donné de temps (en secondes).Cela fonctionne à la fois sur Windows et Unix, et vous n'avez pas à compiler des modules supplémentaires.
Je dois ajouter que la fonction prend en charge les fractions de seconde en tant que paramètre, c'est à dire
socket.sleep(0.5)
va dormir une demi-seconde. Il utiliseSleep()
sur Windows etnanosleep()
ailleurs, si vous avez des problèmes avec Windows précision lors de latime
est trop faible.Vous ne pouvez pas le faire dans le plus pur Lua sans manger le PROCESSEUR, mais il y a un simple, non-mobiles:
os.execute("sleep 1")
(il va bloquer)
Évidemment, cela ne fonctionne que sur les systèmes d'exploitation pour qui "sleep 1" est une commande valide, par exemple Unix, mais pas Windows.
os.clock()
à l'avance, depuis le temps CPU n'est pas consommé.pour windows, vous pouvez le faire:
Fonction De Veille - Utilisation :
sleep(1) -- sleeps for 1 second
Fonction De Pause - Utilisation :
pause() -- pause and waits for the Return key
de l'espoir, c'est ce qu'il vous faut! 😀 - Joe DF
Je voudrais mettre en œuvre une fonction simple pour envelopper le système hôte de la fonction de veille dans C.
Pur Lua utilise seulement ce qui est dans la norme ANSI C. Luiz Figuereido de lposix module contient beaucoup de ce que vous avez besoin de faire plus systemsy choses.
De la deuxième demande, pause, attendez, où vous arrêter le traitement en Lua et de continuer à exécuter votre application, vous avez besoin de coroutines. Vous vous retrouvez avec du code C comme ce qui suit:
et en Lua, vous avez le suivant:
Je suis d'accord avec Jean sur l'emballage de la fonction de veille.
Vous pouvez également utiliser ce enveloppé fonction de veille à mettre en œuvre une fonction de pause en lua (ce qui serait simplement dormir puis de vérifier si une certaine condition a changé le plus souvent). Une alternative est d'utiliser des crochets.
Je ne suis pas exactement sûr de ce que vous voulez dire avec votre troisième bulletpoint (ne pas les commandes généralement achevé avant le prochain est exécuté?) mais les crochets peuvent être en mesure d'aider avec cela aussi.
Voir:
Question: Comment puis-je mettre fin à un Lua thread proprement?
pour un exemple de l'aide de crochets.
Vous pouvez utiliser:
ou vous pouvez utiliser:
Vous voulez
win.Sleep(milliseconds)
, il me semble.Ouais, vous ne voulez certainement pas à faire un occupé-attendre comme vous le décrivez.
Il est également facile à utiliser Étranger que la libc/msvcrt wrapper:
Puis, à partir de lua:
Caveat lector: je n'ai pas essayé ce MSWindows; je ne sais même pas si msvcrt a un usleep()
J'ai commencé avec Lua, mais, ensuite, j'ai trouvé que je voulais voir les résultats au lieu de simplement la bonne vieille ligne de commande de flash. Donc, je viens d'ajouter la ligne suivante dans mon fichier et hop, le standard:
Titre d'exemple, mon fichier n'est qu'une impression, puis une pause de tresorerie donc je suis sûr que vous n'avez pas besoin de posté ici.
Je ne suis pas sûr de la CPU conséquences de l'exécution d'un processus pour un script complet. Cependant l'arrêt de la code de la mi flux de débogage pourrait être utile.
Je crois que pour windows, vous pouvez utiliser:
os.execute("ping 1.1.1.1 /n 1 /w <time in milliseconds> >nul
comme une simple minuterie.(supprimer le "<>" lors de l'insertion de l'heure en millisecondes) (il y a un espace entre le reste du code et
>nul
)Cela devrait fonctionner: