Cherche quelque chose qui peut remplacer api 'sleep'

bikette005 Messages postés 11 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 16 février 2005 - 16 févr. 2005 à 12:35
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 - 16 févr. 2005 à 18:38
Bonjour a tous

mon probleme est simple mais compliqué à expliquer:
je fais un prg vb6 qui simule les frappes d'un utilisateur quelconque sur une application (shell + sendkeys). Dans cette application j'exécute des macros qui mettent un certain temps pour s'exécuter. Donc actuellement j'ai utilisé l'api sleep afin de faire une pause dans mon code (sinon erreur argument incorrect ou qqchose du genre). Mais le probleme c'est que le temps d'exécution des macros est variable (selon le pc, les ressouces deja utilisees ect...) il y a donc des temps morts dans mon appli ou alors elle plante parce qu'elle n'a pas assez de temps pour executer les commandes. j'aimerais savoir si il y a un moyen de detecter la fin du traitement pour continuer le code vb?!?! ou autre chose du moment que ca résou mon pbl!!!
j'espere avoir ete assez claire!?!?


bk005

6 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
16 févr. 2005 à 13:24
Salut,



Regardes tu coté des timers.



Et pour la détection des évenemts tu peux le faire avec la création d'un fichier temporaire



et dans le timer



while fichier not existe le timer continue

sinon stop



apres le stop du timer destruction du fichier temporaire.



C'est de la bidouille mais ca devrais marcher



Tu peux mettre un enr en base de données si tu utilise une base pour detecter la fin

a toi de voir la methode que tu preferes



voila
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
16 févr. 2005 à 13:32
Sur le même rpincipe que Sleep tu peux utiliser le code suivant si tu lance les macros depuis ton soft :



Public Const SYNCHRONIZE = &H100000

Public Const INFINITE = &HFFFFFFFF ' Infinite timeout



Dim pid As Long

Dim phnd As Long



pid = Shell(Macro_a_lancer, vbMaximizedFocus)



If pid <> 0 Then

phnd = OpenProcess(SYNCHRONIZE, 0, pid)

If phnd <> 0 Then

Call WaitForSingleObject(phnd, INFINITE)

Call CloseHandle(phnd)

End If

End If



WaitForSingleObject fait la même chose que Sleep sauf qu'il rend la main dès que le process testé est fini.







<hr size="2" width="100%">Si le cerveau était assez simple pour que nous puissions le comprendre,

nous serions assez bête pour ne pas le comprendre malgré tout.
0
bikette005 Messages postés 11 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 16 février 2005
16 févr. 2005 à 14:37
reponse à nhervagault:
j'ai deja essayé avec des timers et revient au meme mais pas avec les fichiers dont tu parles mais je ne sait pas comment ca marche!!!

reponse a casy:
j'assaie ta methode! je reviens pour dire si ca me convient.

Merci de votre à tous les deux!!


bk005
0
bikette005 Messages postés 11 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 16 février 2005
16 févr. 2005 à 15:04
cette methode n'execute pas le code suivant le lancement de l'application. pourkoi!?!?

sinon est-ce que nhervagault
tu pourrais m'eclairer sur ta methode avec les fichiers temp. Il faut savoir aussi que mes macros je les lance a partir de sendkeys donc j'ai de faire les pauses aussi entre deux sendkeys mais je ne sait pas quel evenement je peu tester pour continuer le code.

Merci


bk005
0

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

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
16 févr. 2005 à 15:28
bikette005 ce code marche très bien depuis
des années, il me sert dans toute une série de softs pour ouvrir le
manuel d'utilisation du logiciel (fichier PDF), et bloquer le logiciel tant que l'opérateur ne ferme pas le manuel.



Evidemment ce code ne marchera que si tu lance le second logiciel (tes
macros) par la commande shell, et que si la commande shell s'est
exécutée correctement, càd quand pid et différent de zéro.



Si tu maitrise les API et que tu peux les utilisées dans tes macros, tu
peux regarder aussi du coté des flags avec les API CreateEvent,
SetEvents et toujours WaitForSingleObject

Le but : ton soft se bloque sur l'attente d'un flag avec WFSO, ta macro
lorsque elle se termine, leve le flag avec SetEvent, et libère ton soft
qui reprend sa course vers la gloire .




<hr size="2" width="100%">Si le cerveau était assez simple pour que nous puissions le comprendre,

nous serions assez bête pour ne pas le comprendre malgré tout.
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
16 févr. 2005 à 18:38
Ta macro crée un fichier

et ton programme scanne si le fichier existe

quand il existe le timer est arreté et le prgramme continue.



je trouve ca simple comme idée ??
0
Rejoignez-nous