Sleep (blocage application) normale ?

Résolu
totalhackerz Messages postés 33 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 30 octobre 2007 - 17 mai 2007 à 18:27
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 17 mai 2007 à 20:08
Bonjour, j'ai un petit Soussi :

je voudrai savoir si ses normale quand je fait un Sleep(10000) de 10s je
n'arrive plus a rien faire avec sur mon application?

si oui comment faire pour évité que mon application se figue ??

Merci d'avance

18 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
17 mai 2007 à 18:34
Oui c'est normal, c'est le role même de Sleep, qui suspend le processus pendant la durée indiquée.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
3
totalhackerz Messages postés 33 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 30 octobre 2007
17 mai 2007 à 18:36
ok merci pour ta réponce
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
17 mai 2007 à 18:42
Bonjour,
Dans quelles circonstances utilises-tu Sleep (il y a peut-être une autre façon, selon le cas, de procéder..) ?
0
totalhackerz Messages postés 33 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 30 octobre 2007
17 mai 2007 à 18:52
Bonjour,
j'ai reprie un code source : ici

mais malheureusement il va beaucoup trop vite pour le pcf8574 ( en 2mot il envoie trop vite les donné )
j'ai donc ralentie tous les étape avec un sleep(2) sa marche trés bien, mais le Soussi, si je lui fait une boucle général ! le log se fige et plus moin de faire quelque chose!
et un timer ne conviendrai pas, car il faudrait que j'en face 50 au moins.

voila si tu a une idée je suis preneur!
merci


   
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
17 mai 2007 à 18:59
C'est bien la première fois que je vois quelqu'un se plaindre de ce que les données sont envoyées trop vite ...
Où est donc la gêne, dans cet envoi "trop rapide" ?
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
17 mai 2007 à 19:00
tu peux toujours te faire une petite fonction de temporisation.

Il en existe surrement dans la codes ou sur Codyx, mais comme j'avais un peu de temps, je t'en ai fait une toute simple.
Tu colle ça dans un module, et il te reste plus qu'a remplacer tes appels à Sleep par cette routine (durée exprimée en millisecondes)

Declare Function GetTickCount Lib "kernel32" () As Long

Public Sub Attente_ms(duree_ms As Long)
Dim deb As Long
Dim fin As Long

   deb = GetTickCount
   
   fin = deb + duree
   
   Do
       DoEvents
   Loop Until fin < getickcount
 
End Sub<hr />
, ----
[code.aspx?ID=41455 By Renfield]

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
17 mai 2007 à 19:05
Je dirais même mieux casy :

Declare Function GetTickCount Lib "kernel32" () As Long

Public Sub Attente_ms(duree_ms As Long)
Dim deb As Long
Dim fin As Long

   deb = GetTickCount
   
   fin = deb + duree
   
   Do
       call sleep(100)
       DoEvents
   Loop Until fin < getickcount
 
End Sub
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
17 mai 2007 à 19:11
Et bien non Dark, car en utilisant Sleep, tu retombe dans le même travers qui a fait l'objet de la question de notre amis.

De plus en mettant Sleep(100) tu ne peux pas avaoir de tempo inférieure à 100ms. Car même si tu passe 5 en argument Sleep(100) t'imposera au minimum un arret de 100ms

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
totalhackerz Messages postés 33 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 30 octobre 2007
17 mai 2007 à 19:13
bien le "pcf8574" doit avoir un certaine sicle, et malheureusement il ne peut dépassé les 400 kbit/s (voire ici )
donc trop vite pour l'I2C mais en rajoutant 2ms entre les étape sa marche trés bien chez moi!

casy, sa ma l'aire pas mal du tous! mais le Soussi ses que je vais de nouveau utilisé Sleep et donc si je fait une boucle général mon application va se figer ! 

donc je peut pas!
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
17 mai 2007 à 19:17
Non mon code n'utilise pas Sleep justement, tu remplace tes Sleep(xx) apr Attente_ms(xx).

Avec la correction de Dark, oui tu auras le même soucis puisqu'il y a Sleep, mais pas avec mon code

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
17 mai 2007 à 19:21
le problème avec ton code casy, c'est que tu fait une attente active (proc à 100 %) !

Donc tu va exécuter ta boucle un très grand nombre de fois alors qu'avec un sleep assez petit (100 ms ou moins), on obtiens la même attente, mais en attente passive => proc à 0%, et ca ralentit beaucoup moins le système !

Du coup, au lieu de passer 100000 fois dans la boucle pour une attente de 200 ms par exemple, tu n'y passera que 2 fois, je pense pas que ce soit négligeable ! (il est bien entendu possible de réduire le sleep, bien que je pense qu'on ne puisse guère faire moins que 60 ms comme le timer de vb).
0
totalhackerz Messages postés 33 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 30 octobre 2007
17 mai 2007 à 19:25
casy: dsl j'avai pas vue ton code! j'ai essai mais sousi comme dit dark le proc à 100% il bug aussi lol
donc je voie que j'ai pas tro le choix que d'utilisé des timer!
bon merci quand meme!
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
17 mai 2007 à 19:33
Oui avec mon code le proc va etre à 100%, ou plus exactement 100 - l'utilisation de l'ensemble des autres process.

Mais est-ce génant, puisque justement la boucle se fait sur un DoEvent c'est à dire rendu de l'execution au système.

Personellement j'utilise ce principe depuis des annèes et malgré le proc à 100%, je ne jamais eu un planatge imputable à ce bout de code.

Bien sur que de rajouter un Sleep dans la boucle résoud le "tout relatif" problème du proc à 100%, mais ici il ne va pas résoudre le problème puisque c'est justement L'instruction Sleep qui pose problème.
Et de plus ça enlève de la précision à la fonction.

Si avec le Timer de VB6, il est dur de descendre en dessous de 50 ms, avec ce code je tournais régulièrement au environs de 2/3ms de limite basse sur un NT4.0 en temps normal, et au maxi 12ms sur un XP PRO surchargé à l'extreme (encodage divx + traitement d'image + reception et decodage staélite simultané), Le proc était à 100% en permanance (et presque 65°C) mais pas à cause de ce code.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
17 mai 2007 à 19:45
le doevents rend bien la main au système MAIS : si il est utilisé de temps en temps, pas de problème, mais dans ton cas, il est appelé sans arrêt, donc le système va faire le yoyo entre les processus du système et le processus de ton prog : à chaque tour de boucle, ton prog va prendre la main, puis rendre la main au système, puis reprendre la main, etc, et ceci des miliers de fois pour chaque attente demandée !

Crois moi, c'est pas ce qu'il y a de plus optimisé !

Alors qu'en mettant un sleep dans la boucle (de 100 ms ou moins), ca fait la même chose sauf que le système reprend la main bien plus longtemps : il fait toujours le yoyo, mais toutes les 100 ms et non plusieurs fois par ms ! Les autres processus ont donc un peu plus de temps pour eux au lieu de devoir à chaque fois rendre la main à ton prog.

Enfin bref, faudrait tester avec un sleep de quelques ms seulement voir comment ca fait (je pense que l'appel à une API prends dans les environ de 60 ms, mais cà reste à tester !).
0
totalhackerz Messages postés 33 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 30 octobre 2007
17 mai 2007 à 19:45
oui je suis d'Accor avec toi mais je cherche aussi a utilisé le moins possible mon proc! car je voudrai qu'il tourne 24/24h le logiciel! donc Soussi quand même!
part contre j'ai revue mon code et je voudrai savoir avec un timer comment peut-on faire pour exécuter tous les 2ms un ligne de commande? de la même façon que l'ex. que j'ai marqué.

ex:
sleep(2)
envoie donné
sleep(2)
recoit donné
....
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
17 mai 2007 à 19:54
Tu ne peux pas

Un timer sous vb ne descent pas plus bas qu'environ 60 ms !

L'astuce ? Exécuter une trentaine d'instruction de 2 ms chacune toutes les 60 ms...
0
totalhackerz Messages postés 33 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 30 octobre 2007
17 mai 2007 à 19:56
lol ok je peut laisser tomber !
merci quand meme à tous !
je vais voire coté Delphi si il y a pas mieux comme soulution!
++
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
17 mai 2007 à 20:08
lol, avant de passer à Delphi (et ca m'étonnerai que ca arrange quelque chose en quoi que ce soit), essaye au moins la méthode du sleep avec un petit paramètre (du style 2 ms, bien que l'attente sera forcément plus longue que 2 ms) dans la boucle d'attente de casy pour voir.
0
Rejoignez-nous