Programme threader sous vb6

Résolu
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011 - 19 oct. 2007 à 01:06
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 6 nov. 2007 à 14:37
Bonsoir,
Est t'il possible de traiter sur un thread l'ecoute d'un socket TCP?
existe t'il une alternative a la programmation threader sous vb6?


Cordialement


Léo

96 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
25 oct. 2007 à 00:17
re
j'avais des trucs à faire ^^

merci pour les compliments

testé pour taille de réception : non non! je me doutais bien....
on a un évènement pour l'envoi mais pas pour la réception, et en même temps çà paraît compréhensible

bref pas grave, de ton utilisation je ne pense pas que tu aies de GROS paquets.
une solution alternative = > le serveur parcelle ses paquets!
on a un NUM suivi de DEUX_POINTS puis un TAG
rien n'empêche de créer un code genre [666:ServeurPart1/3] 321paquet21321à321321envoyer

si CODE = 666 on travaille sur TAG pour savoir combien de paquet on recevra

bref à voir....

pour les réponses de M. Baillie :

protocole => oui évidemment, TCP se charge de renvoyer les paquets s'ils sont incomplets ou intégrité incorrecte, mais ceci est fait avant le traitement de winsock donc avant tout évènement.
çà ne change rien au fait qu'il pourrait y avoir des envois de paquets supplémentaires mais il a répondu donc OK : aucun point vérifiable

buffer = > répondu au dessus, pas possible dans ces conditions

refaire telnet => non c'est plus simple quand même ^^

multicnx => oui puisque c'est l'OS qui gère les ports et le code serveur qui accepte ou non une cnx

pas grand chose à dire de plus, je n'ai pas lu la doc
par contre sa disponibilité est remarque ;)

++
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
25 oct. 2007 à 18:08
Bonjour PCPT,



une solution alternative => le serveur parcelle ses paquets!

on a un NUM suivi de DEUX_POINTS puis un TAG

rien n'empêche de créer un code genre [666:ServeurPart1/3] 321paquet21321à321321envoyer

si CODE = 666 on travaille sur TAG pour savoir combien de paquet on recevra

bref à voir....


Un retour de Mr Baillie a la question :
Les messages on t-il toujours la même structure ?
Exemple :
Le message (après le header) se termine toujours par un POINT VIRGULE et il contient toujours 2CHIFFRES_POINT_6CHIFFRES ?

Ca réponse :
Le message après le header est une valeur URBI. Ca peut être 123.45667, "hello", ou encore ["hello",345.567785,["hi"]] ou n'importe quelle valeur URBI.

Je n'ai pas bien compris ton explication à propos cette solution alternative !

Protocole => oui évidemment, TCP se charge de renvoyer les paquets s'ils sont incomplets ou intégrité incorrecte, mais ceci est fait avant le traitement de winsock donc avant tout évènement.
Çà ne change rien au fait qu'il pourrait y avoir des envois de paquets supplémentaires mais il a répondu donc OK : aucun point vérifiable
Aurais tu besoin d'informations plus précisent ? N'hésite pas a me poser des questions je ferai suivre.

buffer => répondu au-dessus, pas possible dans ces conditions
Comme je l'ai dit plus haut j'ai perdu le fil à ce sujet

Refaire telnet => non c'est plus simple quand même ^^
Tous a fait d'accore, on n'a pas besoin de toutes les fonctionnalités d'un client telnet.

multicnx => oui puisque c'est l'OS qui gère les ports et le code serveur qui accepte ou non une cnx
Ha ma bête noir !!!!!

pas grand chose à dire de plus, je n'ai pas lu la doc !
Si tu veux la survoler : http://www.gostai.com/doc/en/liburbi-1.0/
Je travaille en // sur sa traduction en FR en vu d'une éventuelle adaptation au projet !

@ ++
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
25 oct. 2007 à 21:55
salut,

la solution alternative.....
tu dois envoyer "bonjour"
donc [111:TagHello] bonjour

supposons la chaîne de 100 caractères et que tu décides de ne pas faire de paquet supérieur à 85 carac, çà donnerait 3 envois, par exemple :

[666:Tag_Part1/3] [111:TagHello] 34_CARACTèRES
[666:Tag_Part2/3] [111:TagHello] 33_CARACTèRES
[666:Tag_Part3/3] [111:TagHello] 33_CARACTèRES

le client reçoit les 3 paquets, au premier il voit que c'est une partie, il conserve le 2e header contenu dans le corps, contenant le code tag et message approprié puis ne renvoie l'évènement que quand il a le N/M pour N= M, concaténant à chaque réception

ce n'est qu'une idée, juste pour dire que même si ce n'est pas prévu il y a toujours des solutions possibles...

protocole , pas de question. ma réponse sous-entendait un manque d'info? non non ^^

buffer.... mis à part la partie indiquée plus haut (parceler), on reçoit un message. on connait sa taille. on ne sait pas pour autant si le message reçu est complet, ni si on recevra une suite. mais pas grave

doc, 2 3 liens cliqués..... mouai

++
<hr size ="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
26 oct. 2007 à 00:27
Cette doc en français donne beaucoup de détaille sur URBI ENGINE  qui le SERVEUR.



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
 







http://www.gostai.com/doc/fr/URBI-Techno-FR.pdf









 





Notamment quelques réponses a nos questions :
0

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

Posez votre question
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
26 oct. 2007 à 02:57
Voici une vidéo qui montre très bien un client envoyer des commandes a un serveur urbi !


On peux remarquer que le serveur ne répond pas a chaque commande « regarde les 3 ou 4 première minutes de la vidéo « 



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
 





http://www.gostai.com/medias/nxt-motor-tutorial.html
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
29 oct. 2007 à 13:16
Bonjour PCPT,

Bon j’ai retourné mon code de multiconexion dans tous les sens et cela ne me convient pas ! Je suis trop allé a tâtons et ne comprend pas complètement tous ce qu’il contient.
Donc voila quelque chose qui me semble plus simple.
Bon il est vrai que je ne gère pas dynamiquement mes index mais ça a le mérite d’être simple et efficace

Dans mon module de class :

'Je créer deux variables globales
Global ClientConnecte As Integer
'"ClientConnecte" conservera le nombre de clients connectés sur le serveur
Global DernierIndex As Integer
'"DernierIndex" conservera en mémoire le dernier contrôle chargé

Dans mon form :



'Sur l'événement d'ouverture de mon form "ma feuille"
Private Sub Form_Load()
'Je place le ctrl Winsock d'écoute sur le port 54000
    WinsockEcouteConnexion.LocalPort = 54000
'Je le met en écoute
    WinsockEcouteConnexion.Listen
End Sub


Private Sub WinsockAccepteConnexion_Close(Index As Integer)
'Je ferme l'écoute du serveur
    WinsockAccepteConnexion(Index).Close
'Je décharge la valeur "indexé"
    Unload WinsockAccepteConnexion(Index)
 'Je numérote et mémorise une nouvelle déconnexion
    ClientConnecte = ClientConnecte - 1
'Je vérifie et réinisialise le "contrôle"    If ClientConnecte 0 Then DernierIndex 0
End Sub


Private Sub WinsockAccepteConnexion_DataArrival(Index As Integer, ByVal bytesTotal As Long)
'Je declare Data la il serra reconnu dans ma fonction
    Dim data As String
'je récupère par GetData ce que WinsockAccepteConnexion a reçu.
    WinsockAccepteConnexion(Index).GetData data, vbString
'je l'affiche par un simple message box pour verifier la bonne reseption de data
    MsgBox data
End Sub



'Le serveur écoute les connexions. je les lui fait accepter
Private Sub WinsockEcouteConnexion_ConnectionRequest(ByVal requestID As Long)
'Je numérote et mémorise une nouvelle connexion
    ClientConnecte = ClientConnecte + 1
'Je numérote et mémorise le "contrôle" de cette nouvelle connexion
    DernierIndex = DernierIndex + 1
'Je charge cette nouvelle valeur
    Load WinsockAccepteConnexion(DernierIndex)
'J'accepte la connexion
    WinsockAccepteConnexion(DernierIndex).Accept requestID
End Sub
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
29 oct. 2007 à 13:32
salut,
effectivement çà marchera mais je ne trouve pas çà très propre et c'est relativement couteux en ressource : pourquoi décharger recharger un contrôle alors qu'on pourrait juste le fermer lors de la déco et tout décharger à la fermeture de l'appli....

pourquoi ne pas avoir utilisé ma classe, l'exemple était fourni...

je toucherai au code "serveur" ce soir si tu es dispo
++
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
29 oct. 2007 à 13:41
J’ai voulu revoir cette partie comme j’avais du mal avec ce coté multiconnexion.


Loin de moi l’idée qu’il soit La solution/méthode a utilisé, cela ma juste aidé à comprendre.


Pas de problème pour ce soir ! Je suis à ta disposition.


Merci



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
 




Léo
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
29 oct. 2007 à 14:13
disons que entre mono et multi, la seule vrai différence est qu'en mono, le socket accepte sa connexion tandis qu'en multi, la connexion est acceptée par un socket principal.

çà n'ajoute au final aucune ligne de code, on a juste le nom du composant qui change :
wsock_ser.accept ....
wsock_autre(N).accept ....

c'est donc bien "tout le reste" qu'il faut travailler ;)

tiens j'y pense, le serveur envoie toujours la même syntaxe à savoir [NUM_LONG:TAG_VAR] MESS_VAR
mais le client, qu'envoie-t'il?
d'après la vidéo çà fini par ; ?

@ ce soir ;)
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
29 oct. 2007 à 20:25
Bonsoir PCPT
tiens j'y pense, le serveur envoie toujours la même syntaxe à savoir [NUM_LONG:TAG_VAR] MESS_VAR
mais le client, qu'envoie-t'il?
d'après la vidéo çà fini par ; ?

La syntaxe est toujours la même: device = value;.

exemple:

headPan = 30;

pour questionner le serveur on utilise la syntaxe suivante:

nom_du_device ;

le serveur répondra quelque chose comme:

[139464:notag] 30.102466 puisque j'ai donné le valeur <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /??><st1:metricconverter w:st="on" productid="30 a">30 a</st1:metricconverter> headPan.

l'étiquette s'avérer indispensable lorsqu'il s'agira de déterminer qui envoie quoi dans un contexte de commandes s'exécutant en parallèle, ou pour arrêter une commande en cours d'exécution en tâche de fond.

Il est très simple d'associer une étiquette à une commande en URBI. Il suffit de précéder la commande d'un mot suivi du symbole deux-points (:):

si j'envois :

monetiquette:headPan;

le serveur répond:

[139464:monetiquette] 30.102466
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??> 

Les exemples précédents affectent la valeur d'un device dans un temps donné

headPan = 30 time:3s;

headPan = 30 time:3000ms;

headPan = 30 time:3m;

headPan = 30 time:3h26m15s;

 

cette syntaxe est valable pour toutes action sur le divice!

 

comme pour la vitesse:

headPan = 30 speed:1.4;

 

un autre exemple:

headPan = 30 sin:2s ampli:20,

Cela va faire osciller le device HeadPan autour de 30 degrés avec une amplitude de 20 degrés et une période de 2 secondes. Remarque que la commande se conclue par une virgule et non un point-virgule. cette virgule signifie en quelque sorte " fais tourner ceci en tâche de fond" pour permettre aux commandes suivantes d'être exécutées. Autrement, avec un point-virgule, aucune autre commande ne pourrait ensuite être exécutée puisque l'oscillation ne termine jamais.

 

un exemple pour stocker des éléments dans une liste, simplement en les encadrant par des crochets:

maliste = [1,2,35.12,"salut"];

si je questionne le serveur avec la commande:

maliste;

il répondra:

[139464:notag] [1.000000,2.000000,35.120000,"salut"]

 

une autre manière que la virgule pour indiquer que les commandes doivent s'exécuter en parallèle: utiliser & :

 

x=4 time:1s & y=2 speed:0.1;

 

dans cette exemple les deux commandes démarre exactement au même moment.

 

les commandes peuvent être lancées en série, exactement l'une après l'autre, en utilisant un séparateur | (appelé pipe, tuyau en anglais)

 

exemple:

x=4 time:1s | y=2 speed:0.1;

Il n'y aura aucun temps mort entre les deux commandes

 

Il est possible de regrouper plusieurs commandes en les encadrant avec des accolades et ainsi élaborer des structures temporelles complexes:

exemple:

{ { x=4 time:1s | y=2 speed:0.1 } & z=0 sin:200ms ampli:4 } | t=2,

En général, les commandes entrées dans une console se termine par une virgule, pour éviter de bloquer la connexion après avoir saisi une commande sans fin.

 

Comme il est possible d'exécuter des commandes en parallèle, il se peut que des conflits apparaissent. Par exemple, que se passerait-il si le code suivant était exécuté ?

 

x=1 & x=5;

 

x=5 est une affectation conflictuelle car elle accède à la variable x en même temps que la première affectation. Pour cela, URBI possède plusieurs modes de mélange (blend) pour prendre en charge les éventuels conflits et vous pouvez indiquer le mode souhaité grâce à la propriété blend de la variable. Par exemple:

 

x->blend = add;

 

Cela va demander à URBI d'additionner les valeurs numériques de toutes les affectations conflictuelles sur la variable x

 voila je penses avoir fait le tour.
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
29 oct. 2007 à 20:43
La syntaxe peut etre aussi spécifique comme pour la gestion Le branchement conditionnel et les boucles<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>





Le branchement conditionnel et les boucles disponibles avec le C et le C++ sont présents dans URBI : if ... else , for et while. Les exemples suivants illustrent ces constructions (la commande echo que vous trouverez parmi les exemples affiche tout simplement l'expression en tant que message-système).







if








if

réalise un test et exécute la commande associée, à la condition que le test ait réussi:






if (backSensorM > 0) {








       appuye = 1;








       echo "Capteur du dos appuyé";







};






La dernière commande entre accolades ne nécessite pas d'être conclue par un point-virgule comme dans l'exemple précédent. En effet, les points-virgules sont des séparateurs de commande et non des terminateurs de commande. Vous pouvez conclure par un point-virgule comme en C, mais cela est inutile (cela ajoute une commande vide).






if (distance < 10)








  echo "Obstacle détecté"







else








  echo "Aucun obstacle";







[167322:notag] *** Aucun obstacle






Remarquez qu'il n'y a pas de point-virgule avant else mais qu'il y en a un (ou tout autre séparateur de commande) après l'accolade finale.






 






Juste pour te dir que la syntaxe c’est du urbi il y a des généralités mais aussi beaucoup de cas particulier !
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
29 oct. 2007 à 22:52
dispo ;)

umm ok. alors TOI, comment veux-tu accéder aux commandes, c'est à dire dev l'accès client.

genre CTRL.SendCommand "x=4 time:1s & y=2 speed:0.1;" ou tu as d'autres attentes?

Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
29 oct. 2007 à 23:11
Bonsoir PCPT


Je ne comprends pas bien ta question



Mes attentes sont de pouvoir exploiter un robot sous serveur urbi ce que je peux déjà faire avec le client telnet de windows.<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>





Le fait de coder ce client tcp pourrait me permettre par la suite de pouvoir gérer une interface graphique, la sauvegarde des programmes urbi et de rendre plus agréable le client qu’une simple invite de commande MsDos.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
29 oct. 2007 à 23:31
au bout de 6 pages çà serait malheureux que je n'ai pas compris ce point ^^

je ne te parle qu'au niveau confort de syntaxe. je m'apprête (j'ai commencé) à traiter la partie serveur. néanmoins comme je fais un OCX, tu auras justement la liberté de coder ton appli VB6 comme tu le veux (revoir précédents échanges)

ma question est donc là : comment veux-tu accéder à l'envoi de commandes.

voici ce qui est fait pour le moment, côté client (donc le code que TU saisiras):

ctrl.valuemessage="x=4 time;"
ctrl.sendata

OU

ctrl.sendata(text1.text)

OU

ctrl.valuemessage=text1.text
msgbox "envoie réussi??   =>  " & ctrl.sendata

çà çà fonctionne, c'est vraiment une question de... d'envie ^^
puisque n'ayant pas intégré ma classe je doute que tu puisses aisément retoucher à l'OCX ^^

tu parles de sauvegarde, tu veux une trace écrite (fichier texte) des paquets envoyés et reçus?
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
29 oct. 2007 à 23:52
ctrl.sendata(text1.text)
C'est simple, c'est bien! 




Tu parles de sauvegarde, tu veux une trace écrite (fichier texte) des paquets envoyés et reçus?<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>







 






Non je parle de pouvoir sauvegarder le code que je viens d’envoyer.





Exemple :





Je saisi ces lignes de code :






 






headPan = 30;





headPan = -30;








{ { headyeat = 10 time:1s | y=2 speed:0.1 } & z=0 sin:200ms ampli:4 } | t=2,





Je test et si ok je save
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 oct. 2007 à 00:17
tu sauves... quoi?
la ligne { { headyeat = 10 time:1s | y=2 speed:0.1 } & z=0 sin:200ms ampli:4 } | t=2,

beh çà c'est pas le contrôle aussi, c'est le dev (donc toi) selon le retour du serveur
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
30 oct. 2007 à 00:34
Oui je gèrerais la sauvegarde par la suite.


Dis moi il pourrait etre utile de sauvegarder les messages d’erreur du socket dans un fichier texte non ?

tu parles de sauvegarde, tu veux une trace écrite (fichier texte) des paquets envoyés et reçus?


Je n’y avais pas pensé très bonne idée


Pratique pour vérifier la compatibilité d’éventuelle extension de protocole ou autre


 
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 oct. 2007 à 01:08
extension de protocole?
mon ptit doigt me dit que je perds peut-être mon temps....

tu peux reformuler ta dernière phrase stp?
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
30 oct. 2007 à 01:18
Je ne sais pas dans un avenir plus ou moins proche les changements/améliorations que le serveur urbi va subir !


Le fait d’avoir un log sur ce qui transite entre le client est le serveur pourrait m’être utile pour régler d’éventuel incompatibilité et faciliter la modification du code.



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
 




Le terme « extension de protocole » n’est peut être pas celui que j’aurais du employer pour expliquer mon idée
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
30 oct. 2007 à 01:19
TCP reste TCP!
0
Rejoignez-nous