Probleme de boucle qui marche pas au bout d'un certain nombre de tours

Résolu
Leptis Messages postés 17 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 26 juillet 2007 - 8 déc. 2005 à 15:01
Leptis Messages postés 17 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 26 juillet 2007 - 9 déc. 2005 à 18:23
salut à tous les pro de la prog et les autres. Je vous prévien tout de
suite je n'ai pas un niveau tres trerible en cpp mais j'arrive toute
fois a faire quelques truc comme ce prog qui qui est cencé simuler les
touches du clavier et tester toutes les posiblités. Il marche tres bien
les 1600 premieres fois mais dans les environs de ce nombre il se met a
délirer et a taper nimporte quoi. J'ai essayé bien des configuration
mais il y a toujour ce probleme. Merci a tous ce qui serons résoudre ce
délica problème.



le prog et en deux parti l'executable et un fichier texte composé de

-1

-1

-1

-1

-1

-1

-1

0



voici le code de l'executable



#include

#include

#include

#include

#include

#include

#include

#include

#include







void fonction(int varfonction)

{



if(varfonction == 0)

{

keybd_event(VK_SPACE,0x20,0,0);

keybd_event(VK_SPACE,0x20,KEYEVENTF_KEYUP,0);

return;

}





if(varfonction == 1)

{

keybd_event('A',0,0,0);

keybd_event('A',0,KEYEVENTF_KEYUP,0);

return;

}







if(varfonction == 2)

{

keybd_event('B',0,0,0);

keybd_event('B',0,KEYEVENTF_KEYUP,0);

return;

}





if(varfonction == 3)

{

keybd_event('C',0,0,0);

keybd_event('C',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 4)

{

keybd_event('D',0,0,0);

keybd_event('D',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 5)

{

keybd_event('E',0,0,0);

keybd_event('E',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 6)

{

keybd_event('F',0,0,0);

keybd_event('F',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 7)



{

keybd_event('G',0,0,0);

keybd_event('G',0,KEYEVENTF_KEYUP,0);

return;

}





if(varfonction == 8)

{

keybd_event('H',0,0,0);

keybd_event('H',0,KEYEVENTF_KEYUP,0);

return;

}





if(varfonction == 9)

{

keybd_event('I',0,0,0);

keybd_event('I',0,KEYEVENTF_KEYUP,0);

return;

}





if(varfonction == 10)

{

keybd_event('J',0,0,0);

keybd_event('J',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 11)

{

keybd_event('K',0,0,0);

keybd_event('K',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 12)

{

keybd_event('L',0,0,0);

keybd_event('L',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 13)

{

keybd_event('M',0,0,0);

keybd_event('M',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 14)

{

keybd_event('N',0,0,0);

keybd_event('N',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 15)

{

keybd_event('O',0,0,0);

keybd_event('O',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 16)

{

keybd_event('P',0,0,0);

keybd_event('P',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 17)

{

keybd_event('Q',0,0,0);

keybd_event('Q',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 18)

{

keybd_event('R',0,0,0);

keybd_event('R',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction ==19)

{

keybd_event('S',0,0,0);

keybd_event('S',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 20)

{

keybd_event('T',0,0,0);

keybd_event('T',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 21)

{

keybd_event('U',0,0,0);

keybd_event('U',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 22)

{

keybd_event('V',0,0,0);

keybd_event('V',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 23)

{

keybd_event('W',0,0,0);

keybd_event('W',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 24)

{

keybd_event('X',0,0,0);

keybd_event('X',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 25)

{

keybd_event('Y',0,0,0);

keybd_event('Y',0,KEYEVENTF_KEYUP,0);

return;

}



if(varfonction == 26)

{

keybd_event('Z',0,0,0);

keybd_event('Z',0,KEYEVENTF_KEYUP,0);

return;

}



}









int main()

{



int a =0;

int varfonction = 0;





int vari1;

int vari2;

int vari3;

int vari4;

int vari5;

int vari6;

int vari7;



ifstream fichier;

fichier.open("adresse du fichier texte");

fichier >> vari1 >> vari2 >> vari3 >> vari4

>> vari5 >> vari6 >> vari7 >> a;

fichier.close();







for(int b=0;b

7 réponses

Leptis Messages postés 17 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 26 juillet 2007
9 déc. 2005 à 18:23
Apres beausoup d'essai mon prog marche finalement merci a tous pour votre aide tres precieuse !!!!!!!!!!!!!!!!
3
Alcantornet Messages postés 89 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 14 novembre 2007
8 déc. 2005 à 15:30
juste en passant : tu pourait mettre des switch à la place de tous ces if
0
Leptis Messages postés 17 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 26 juillet 2007
8 déc. 2005 à 15:34
ouai mais sa regle toujour pas mon problème
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 déc. 2005 à 16:05
Avec un tableau, ce sera un peu plus court:

int lettre[] = {VK_SPACE, 'A', ..., 'Z'};
keybd_event(lettre[varfonction],0x20,0,0);
keybd_event(lettre[varfonction],0x20,KEYEVENTF_KEYUP,0);

Tu pourrais pas donner un code propre, sans E/S inutiles, qu'on puisse tester et voir le problème?
0

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

Posez votre question
NAVIE Messages postés 23 Date d'inscription samedi 1 janvier 2005 Statut Membre Dernière intervention 23 avril 2006
8 déc. 2005 à 19:37
Leptis utilise au lieu de tous ces if switch comme ca ce sera plus simple





switch(variable)

{

case Valeur1:

Instruction....

break;

case Valeur2:

Instruction....

break;

case Valeur3:


Instruction....

break;


default:


Instruction....

break;

}
0
vdust Messages postés 43 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 14 mars 2007
9 déc. 2005 à 00:42
A part la syntaxe (la solution de
vecchio56 est la plus efficace et la plus portable), revenons au
problème initial. Ce qu'il faut bien comprendre, c'est que l'envoi d'un
évément et son traitement par le système sont asynchrones : l'événement
est placé dans une pile en attendant d'être traité... on ne sait pas a
priori quand. Or, ton programme tourne en continu et va envoyé très
probablement les événements plus vite que le système ne peut les
traiter (d'autant qu'il solicite de manière intensive le processeur
pendant tout le processus). La pile se retrouve donc rapidement saturée
(vers la boucle 1600 ???) et tous les messages qui ne peuvent pas
entrer dans la pile sont tout simplement ignorés (il me semble), ce qui
conduit à la perte de certains messages ; d'où le comportement
constaté. Une solution est de donner à la fin de chaque boucle un peu de temps au système pour traiter les événements envoyés, grâce à la fonction Sleep(nombre_de_millisecondes), placée juste après ta ligne "keybd_event(VK_RETURN,0x1C,0,0);". Je pense que Sleep(5);
est raisonnable (tu peux tenter de réduire encore cette valeur si tu
souhaites que ton programme tourne plus vite. Mais moins le système a
de temps pour traiter les messages, plus les risques de perte
augmentent).

Je n'ai pas testé, mais j'espère que celà solutionnera ton problème.



Une autre remarque si tu utilises (ce qui est pratiquement une
certitude ^^) Windows 2000 ou XP : MSDN préconise l'emploi de la
fonction SendInput à la place de keydb_event sur ces systèmes.






-- Virtual Dust --
0
Leptis Messages postés 17 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 26 juillet 2007
9 déc. 2005 à 17:41
Avant tout merci a tous pour vos réponse. Pour repondre a vdust j'avais deja pensé a une surcharge du proc et j'avais mis un wait une seconde et au bout de 26 minutes (1600 boucles) toujour le meme probleme. J'ai meme pensé a une saturation
de la ram voila pourquoi le prog s'eteind et ce relance au bout de mille combinaisons. J'ai essayé les sendInput mais le prob persite.
0
Rejoignez-nous