Pb de synchro avec Qt

Pb de synchro avec Qt - C++ - Programmation

Marsh Posté le 28-11-2005 à 11:26:12    

Salut, c'est encore moi avec mon jeu en Qt.
J'ai un problème de 'synchronisation' :
Lorsque le joueur clique sur une case (c'est un othello/reversi) pour jouer, ça lance un signal->slot qui joue et qui ensuite lance mon intelligence artificielle.
Le problème c'est que ça va trop vite : on a pas le temps de voir ce que l'humain joue, que le plateau est recouvert par le coup du CPU.
J'ai essayé de mettre des sleep() dans mon slot entre le coup de l'humain et du cpu, ça attend bien, mais ça affiche toujours les 2 coups simultanément, ce qui fait que l'on ne vois pas le coup du joueur.
J'ai essayé de faire jouer l'IA en cliquant sur un bouton, et ça marche, mais ça ne me convient pas.
 
La question est peut-être un peu vague, mais si quelqu'un a déjà connu ce problème, je suis preneur.
 
D'avance merci!

Reply

Marsh Posté le 28-11-2005 à 11:26:12   

Reply

Marsh Posté le 28-11-2005 à 11:48:16    

je pense qu'il faudrait un genre de timer qui executerai le meme code que lorsque tu clic sur le bouton.
 
genre la même chose qu'en java avec les Timer et ActionListener.

Reply

Marsh Posté le 28-11-2005 à 12:14:58    

Et si tu tapais simplement 'Timer' dans ton Qt Assistant ?

Reply

Marsh Posté le 28-11-2005 à 12:47:40    

ok j'ai vu qu'il y avait une classe QTimer en effet, dans mon cas il faut que lorsque que je clique sur ma widget, je lance un slot qui fait une chose, puis (3 secondes après par exemple) une autre.
 
C'est possible avec QTimer? comment s'y prendre en 2 mots? ou fait-il que je passe par 2 signaux/slot?
 
Merci ;)

Reply

Marsh Posté le 28-11-2005 à 14:39:06    

En 2 mots, QTimer::singleShot()
 
En plus de 2 mots, voici ton shéma actuel:
joueur humain joue > déclenche un signal
slot branché au signal > l'IA joue
 
La modif est d'insérer un slot supplémentaire:
joueur humain joue > déclenche un signal finHumain
slot branché au signal finHumain > lance un timer singleshot branché au slot IAJoue
Slot IAJoue > lance la phase de l'IA.
 
Tu n'as qu'à régler le délai du timer et t'es rendu.

Reply

Marsh Posté le 28-11-2005 à 19:11:15    

IrmatDen a écrit :

En 2 mots, QTimer::singleShot()
 
En plus de 2 mots, voici ton shéma actuel:
joueur humain joue > déclenche un signal
slot branché au signal > l'IA joue
 
La modif est d'insérer un slot supplémentaire:
joueur humain joue > déclenche un signal finHumain
slot branché au signal finHumain > lance un timer singleshot branché au slot IAJoue
Slot IAJoue > lance la phase de l'IA.
 
Tu n'as qu'à régler le délai du timer et t'es rendu.


 
Yes! ça marche nickel!  
je fais :
  QTimer *timer = new QTimer(this);
  connect(timer, SIGNAL(timeout()), this, SLOT(monSlot()));
  timer->start(2000);
et mon slot ce lance au bout de 2 secondes.
 
merci beaucoup à toi IrmatDen et à ceux qui m'ont répondu ;)

Reply

Marsh Posté le 28-11-2005 à 23:55:00    

Y'a pas de quoi ;)
 
Mais pourquoi passes-tu par un timer, plutôt que par le single shot?
Voilà l'équivalent de tes 3 lignes:

Code :
  1. QTimer::singleShot(2000, this, SLOT(monSlot()));


Pas de création superflue de timer, pas de connect. En interne c'est sans doute très ressemblant à ce que tu as fait, mais là est tout l'intérêt d'une lib n'est-ce pas? :)

Reply

Marsh Posté le 30-11-2005 à 18:38:57    

En effet passer par un QTimer::singleShot(2000, this, SLOT(monSlot())) fonctionne également et il n'y a pas de création superflue de timer, pas de connect.
 
Merci à toi.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed