Récupération de données MySQL

Noxid Messages postés 78 Date d'inscription lundi 13 mai 2002 Statut Membre Dernière intervention 4 mai 2008 - 1 avril 2006 à 21:18
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 - 4 avril 2006 à 15:48
Salut tout le monde!



Voilà mon problème: je crée un petit jeu en ligne en VisualBasic. Pour cela, j'ai deux applications: le serveur et le client.

Le serveur accède directement à une base de données MySQL où sont enregistrées des données.

Le client doit passer par l'application serveur pour récupérer les données.



Voilà comment ca se déroule:

1) Le client envoi une requete au serveur

2) Le serveur transforme cette requete en requete SQL

3) Le serveur execute cette requete et obtient une réponse

4) Le serveur renvoi toute la réponse SQL au client

5) Le client recoit le tout et classe tout bien comme il faut dans un FlexGrid

6) Le client se sert des données



Mais il s'écoule un lap de temps trop long entre 1) et 5). Voilà en gros comment c'est codé (chez le client):



' 1. Envoi de la requete SQL

' 2. Classement dans le FlexGrid ici

' 3. Je me sers des données classées dans le Flexgrid



Vu le temps qu'il s'écoule, ben au moment ou je
cherche à me servir des données classées dans le flexgrid, elles n'y
sont pas encore! Comment faire pour attendre que les données arrivent
dans le flexgrid pour procéder au 3. ?

J'ai essayé une boucle while, un If avec un retour étiquette,... La
boucle fait planter VisualBasic et rend carrément inutilisable le PC,
et la condition If ne se vérifie jamais!



De là, je me pose la question suivante:

Comment faire pour que mon application attendre que l'étape "1. (envoi
de la requete SQL)" soit terminée avant de continuer? Enfait, l'envoi
de la requete se fait sous forme de fonction:

MySQL_Query("Requete SQL")



Il me semble qu'en VB, il y a moyen d'attendre la fin de la fonction
avant de procéder à la suite... Mais je n'en suis pas sur et je ne sais
pas comment faire! Pouvez-vous m'aider? Je suis désespéré!





Merci d'avance!

++



PS: Je suis sous VB6.

3 réponses

rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
4 avril 2006 à 12:56
Salut noxid,

intéressant,
bon, commences par sortir de dessous VB, et reviens à ton clavier, c'est plus pratique :)

L'explication est limpide, c'est très plaisant à étudier.
Par contre, il faudrait entrer un peu plus dans des considérations techniques :

Qu'est MySQL_Query ? une variable de référence à un objet? une méthode d'un objet créé implicitement (sans déclaration explicite)? Si c'est une méthode, que renvoie-t-elle? Si elle ne renvoie rien, comment (où, quand) reçois-tu le résultat?

il faut être un peu précis encore, pour la réponse soit adaptée à ton problème, car il existe de nombreuses méthodes pour synchroniser 2 traitements.

à toute,


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
0
Noxid Messages postés 78 Date d'inscription lundi 13 mai 2002 Statut Membre Dernière intervention 4 mai 2008
4 avril 2006 à 15:21
Ca va VB m'a pas completement écrasé :D



MySQL_Query est une fonction du client: ca envoie la requete SQL à
l'application serveur qui lui la traite: il recupere les données de la
base de données d'après la requete fournie par le client. Cette
fonction ne renvoit rien, le tout se passe par Winsock.

Une fois que le serveur a récupéré les données, ca les renvoie au client...

Le client les recoit pour pouvoir les lire et les classer dans un
FlexGrid... Seulement, au moment ou l'instruction qui classe tout dans
le FlexGrid est executée, le données n'ont pas encore fini d'arriver.



Enfait, j'ai mis en place un systeme de "header" pour chaque requete
entrante sur le client. Si elle commence par "#DATAGRID#", c'est qu'il
faut classer les données dans le FlexGrid (avec des paramètres inclus
dans la requete: j'ai fait une sorte de pseudo-langage/macro grace à la
fonction Split).



Les données sont bien classées bien comme il faut, tout est niquel
jusqu'ici. Seulement, la fonction d'après n'est pas executée comme je
veux. Il faut que je relance la procédure une seconde fois pour avoir
le résultat attendu et c'est très embettant. Surtout que je ne peux pas
savoir combien de temps il faut attendre car la table de base de
données risque d'être bien remplie d'ici quelques temps! Et puis le
temps de latence du serveur dépendra de sa charge etc.!



Donc en fin de compte mon problème:

Comment attendre la fin de l'execution d'une fonction pour passer à la suite?





Merki de ton aide! Elle me serait bien préciseuse!

++

Noxid
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
4 avril 2006 à 15:48
bon,

il te faut sûrement un tiers de plus (mais intégré dans ton client).

tu fais une Classe CestMoiQuiParleAvecLeServeur :
- elle a une méthode VasYDemandeLui(strRequete) qui renvoie un boolean qui dit qu'elle est arrivée à engager la conversation.
- elle peut renvoyer un évènement TuDevinerasJamaisCeQuilMaDit(varReponse)

dans ton Formulaire JeSuisTimideMaisJeSaisCeQueJeVeux :

- tu instancies un membre privé de Type CestMoiQuiParleAvecLeServeur, en prenant soin de conserver une poignée sur les évènements :
Private WithEvents MaCopine As CestMoiQuiParleAvecLeServeur
et plus loin (genre Form_Load) :
'il est important de ne pas construire implicitement à la déclaration
Set MaCopine = New CestMoiQuiParleAvecLeServeur

- dans la procédure de ton choix, tu demandes à MaCopine de parler avec le serveur :
MaCopine.VasYDemandeLui("On pourrait avoir un verre d'eau?") 'et tu ne fais rien d'autre

- dans la procédure MaCopine_TuDevinerasJamaisCeQuilMaDit(varReponse), tu traites la réponse en faisant ce qu'il y a à faire :
If varReponse ="La prochaine fois, faudra consommer!" Then
Msgbox "J'attendais que ça, il finit à quelle heure!"
Else
Msgbox "Il finit à quelle heure!"
'tu peux aussi trier ton FlexGrid
End if

Il ne reste plus qu'à trouver ce qu'il faut mettre dans la méthode VasYDemandeLui de la Classe CestMoiQuiParleAvecLeServeur, en sachant que c'est toujours à la copine d'attendre que le serveur veuille bien lui répondre, et que c'est elle qui préviendra JeSuisTimideMaisJeSaisCeQueJeVeux que le serveur lui a répondu!

Quel est ton avis?

PS: pour changer un peu, et dans un esprit de parité, j'ai pris des actrices!


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
0
Rejoignez-nous