totalhackerz
Messages postés33Date d'inscriptiondimanche 23 mai 2004StatutMembreDernière intervention30 octobre 2007
-
17 mai 2007 à 18:27
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDerniè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 ??
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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" ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
totalhackerz
Messages postés33Date d'inscriptiondimanche 23 mai 2004StatutMembreDernière intervention30 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 !
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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).
totalhackerz
Messages postés33Date d'inscriptiondimanche 23 mai 2004StatutMembreDernière intervention30 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!
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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 !).
totalhackerz
Messages postés33Date d'inscriptiondimanche 23 mai 2004StatutMembreDernière intervention30 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é.
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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.