Sleep (blocage application) normale ? [Résolu]

totalhackerz 33 Messages postés dimanche 23 mai 2004Date d'inscription 30 octobre 2007 Dernière intervention - 17 mai 2007 à 18:27 - Dernière réponse : cs_DARKSIDIOUS 15840 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention
- 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
Afficher la suite 

18 réponses

Répondre au sujet
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 17 mai 2007 à 18:34
+3
Utile
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 #
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_casy
totalhackerz 33 Messages postés dimanche 23 mai 2004Date d'inscription 30 octobre 2007 Dernière intervention - 17 mai 2007 à 18:36
0
Utile
ok merci pour ta réponce
Commenter la réponse de totalhackerz
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 17 mai 2007 à 18:42
0
Utile
Bonjour,
Dans quelles circonstances utilises-tu Sleep (il y a peut-être une autre façon, selon le cas, de procéder..) ?
Commenter la réponse de jmfmarques
totalhackerz 33 Messages postés dimanche 23 mai 2004Date d'inscription 30 octobre 2007 Dernière intervention - 17 mai 2007 à 18:52
0
Utile
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


   
Commenter la réponse de totalhackerz
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 17 mai 2007 à 18:59
0
Utile
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" ?
Commenter la réponse de jmfmarques
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 17 mai 2007 à 19:00
0
Utile
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 #
Commenter la réponse de cs_casy
cs_DARKSIDIOUS 15840 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 17 mai 2007 à 19:05
0
Utile
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
Commenter la réponse de cs_DARKSIDIOUS
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 17 mai 2007 à 19:11
0
Utile
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 #
Commenter la réponse de cs_casy
totalhackerz 33 Messages postés dimanche 23 mai 2004Date d'inscription 30 octobre 2007 Dernière intervention - 17 mai 2007 à 19:13
0
Utile
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!
Commenter la réponse de totalhackerz
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 17 mai 2007 à 19:17
0
Utile
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 #
Commenter la réponse de cs_casy
cs_DARKSIDIOUS 15840 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 17 mai 2007 à 19:21
0
Utile
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).
Commenter la réponse de cs_DARKSIDIOUS
totalhackerz 33 Messages postés dimanche 23 mai 2004Date d'inscription 30 octobre 2007 Dernière intervention - 17 mai 2007 à 19:25
0
Utile
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!
Commenter la réponse de totalhackerz
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 17 mai 2007 à 19:33
0
Utile
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 #
Commenter la réponse de cs_casy
cs_DARKSIDIOUS 15840 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 17 mai 2007 à 19:45
0
Utile
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 !).
Commenter la réponse de cs_DARKSIDIOUS
totalhackerz 33 Messages postés dimanche 23 mai 2004Date d'inscription 30 octobre 2007 Dernière intervention - 17 mai 2007 à 19:45
0
Utile
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é
....
Commenter la réponse de totalhackerz
cs_DARKSIDIOUS 15840 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 17 mai 2007 à 19:54
0
Utile
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...
Commenter la réponse de cs_DARKSIDIOUS
totalhackerz 33 Messages postés dimanche 23 mai 2004Date d'inscription 30 octobre 2007 Dernière intervention - 17 mai 2007 à 19:56
0
Utile
lol ok je peut laisser tomber !
merci quand meme à tous !
je vais voire coté Delphi si il y a pas mieux comme soulution!
++
Commenter la réponse de totalhackerz
cs_DARKSIDIOUS 15840 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 17 mai 2007 à 20:08
0
Utile
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.
Commenter la réponse de cs_DARKSIDIOUS

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.