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
3 nov. 2007 à 02:02
normalement çà doit être bon ici

lance d'abord le reg.bat
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
3
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
19 oct. 2007 à 08:36
Salut,
Je n'ai pas bien compris ta question.

En VB6 pour les socket tu peux utiliser le composant Winsock (à ajouter à ton pojet dans le par le menu composant)

il te suffit de l'ajouter à une form et de parametrer son port puis de le faire ecouter sur ce port donné. ensuite il possède un événementConnectionRequest qui t'avisera d'une nouvelle connection (à toi ensuite de l'accepter ou non)

je ne sais pas si cela t'avance.

@+: Ju£i?n
Pensez: Réponse acceptée
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
19 oct. 2007 à 10:15
VB6 ne sais pas gérer le multithreading, l'essayer c'est le plantage garantie.

Par contre tu eux essayer de faire du multithreading dans une dll en C que tu appelera depuis VB, mais attention, il faut prevoir dans la dll toute l'interface avec les threads que tu vas créer. Pas question par exemple de faire de la mémoire partage que tu viendrais directement attaquée par VB.

Personellement, j'ai déjà réussi à faire du multithreading avec une dll C sur des threads de timer ou de reception de com série, mais c'est particulièrement galère. Par contre c'était toujours des thread totalement autonomes et asynchrones. Je n'ai jamais réussi à mettre des opérations de synchronisations des threads, à chaque fois, soit ça générais une erreur système soit ça plantais VB.

Pense à faire régulièrement un backup de ton projet VB (chaque fois que tu tappe un bout de code important), ça m'est arrivé plusieur fois sur plantage de VB de perdre l'intégralité des sources du projet.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
0
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 à 10:23
Merci a vous deux pour ces informations !


Je vais tenter dans un 1er temps de contourner le problème avec une boucle : j'envoie - j'écoute - je traite.
0

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

Posez votre question
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
19 oct. 2007 à 10:32
Salut,
Tout dépend de ce que tu veux faire, mais je pense qu'en utilisant Winsock et  tout ces événements, tu pourras aisément te passer de boucle.

@+: Ju£i?n
Pensez: Réponse acceptée
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
20 oct. 2007 à 12:33
Leo
tu pars dans 35 directions sans prendre le temps de réfléchir....

les conseils que t'a donné l'auteur de Ubi machin sont pasé sur un langage avec Thread!

pour ton utilisation/librairie Winsock suffit, et aucun besoin de thread pour l'utilisation.

prend le temps de faire des tests, de comprendre comment les packets sont envoyés et reçus, la conception serveur/client (sur papier si besoin, c'est la conception, pas des lignes de code) et tu vas vite comprendre.

j'envoie => NON, IL écoute d'abord
envuite tu envoies mais IL (le serveur) ECOUTE. çà veut pas dire qu'il attend et donc reste bloqué, juste qu'il écoute.
et quand tu envoies après tu n'attends pas une réponse, tu VAS en recevoir une (ou une erreur) donc pas d'attente, c'est de l'évènementiel...

fais le test seul avec 2 sockets (winsock) sur une form sur 127.0.0.1 avec 2 ports APRèS avoir testé sur papier
bon courage ;)

PCPT  [AFCK]
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
20 oct. 2007 à 23:32
Ca fait du bien dé fois de se faire remettre en question ! Merci PCPT.


Donc comme le confirme PCTP je n'ai pas besoin de thread !


Après tests, recherches et analyses de ce qui se fait avec winsock !


J'ai opté pour une solution qui utilise MSWINSCK.OCX .


Je ne suis pas sur d'être clair dans mes commentaires n'hésitez pas à me reprendre




Option Explicit



'le timer verifie a 500ms l'etat du socket et de maniere evenementielle.
Private Sub CheckState_Timer()
'Si il est pas connecté le bouton connect et autorise le "transfet " (Else) si il est connecté mais pas de "transfert" en cours il deconnecteIf Socket.State 7 Then Go.Caption "Se déconnecter": send.Enabled = True: Exit Sub Else: send.Enabled = False
'Si il est connecté le bouton déconnectIf Socket.State 0 Then Go.Caption "Se connecter": Exit Sub
'si y a u ne transaction en cours , le bouton annule la transaction
Go.Caption = "Annuler"
End Sub



'a L'ouverture du form "la fenetre"
Private Sub Form_Load()
'On démarre le timer
CheckState_Timer
End Sub



'lors du click sur le bouton go
Private Sub Go_Click()
'Si le socket est différent de 7
If Socket.State <> 7 Then
   'si le socket est = a 0
    If Socket.State = 0 Then
   'on ferme le socket
    Socket.Close
   'on ce connect à l'adresse et au port
    Socket.Connect addr.Text, port.Text
   'si non
    Else
   'on ferme le socket
    Socket.Close
    End If
'on lance le timer
CheckState_Timer
Else
'on ferme le socket
Socket.Close
'on relance le timer
CheckState_Timer
End If
End Sub



'lors du click sur le bouton send

Private Sub send_Click()
'si on est connecté on envoie les donnés et on les affiches If Socket.State 7 Then recep.Text recep.Text & "<Client> : " & vbCrLf & Emission.Text & vbCrLf & vbCrLf: Socket.SendData Emission.Text: Emission.Text = ""
End Sub


Private Sub Socket_Close()
'La connexion est términé (on le dit)
recep.Text = recep.Text & recep.Text & "<system> : Connexion terminée!" & vbCrLf & vbCrLf
'on déconnect le transfert
send.Enabled = False
End Sub


Private Sub Socket_Connect()
'on ce connect (on le dit)
recep.Text = recep.Text & recep.Text & "<system> : Connexion établie avec " & Socket.RemoteHostIP & " !" & vbCrLf & vbCrLf
'on autorise le transfert
send.Enabled = True
End Sub



'traitement des donnés

Private Sub Socket_DataArrival(ByVal bytesTotal As Long)
'déclaration de data
Dim data As String
'on les stock dans la variable data
Socket.GetData data, vbString
'on les affiche
recep.Text = recep.Text & "<" & Socket.RemoteHostIP & "> : " & vbCrLf & data & vbCrLf & vbCrLf
End Sub


Private Sub Socket_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
'on affiche l'erreur
MsgBox "Erreur avec le socket! & vbcrlf # " & Number & vbCrLf & Description
'on ferme le socket
Socket.Close
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
20 oct. 2007 à 23:52
pas mal

manque un buffer dans dataarrival (pour les gros paquets, exemple finir tes SENDdata par "<@MESS_FIN@>" comme çà SI la fin n'est pas le séparateur attendu tu stoques et ne fais rien. winsock n'envoie pas forcément le message en une seule fois....
(pas testable sur 127.0.0.1 ^^)

2e point, pour être sûr de laisser le temps après un envoi, un petit DOEVENTS

enfin attention au timer qui risque de reconnecter automatiquement lors de la fermeture, ce qui pourra planter ton appli puisque tu ne fermes pas le timer et le socket à la fermeture de la form

très bon début !
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
21 oct. 2007 à 00:32
PCTP tes remarques me semble tout à fait importantes, mais un peu complexe pour le petit vbist que je suis!
Aurais tu un moment pour soit me donner quelques exemples concrets voir même intervenir directement sur le code !<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>


Tu dis : manque un buffer dans dataarrival (pour les gros paquets, exemple finir tes SENDdata par "<@MESS_FIN@>"


A quoi servent les @ et pourquoi les placer entre <>


Je ne comprends pas la conception du « buffer » comme tu voudrais me le faire appliquer.


Le DOEVENTS oui mais mon timer perd les pédales je crois que je ne l'emploie pas correctement.
 



'lors du click sur le bouton send


Private Sub send_Click()
'si on est connecté on envoie les donnés et on les affiches If Socket.State 7 Then recep.Text recep.Text & "<Client> : " & vbCrLf & Emission.Text & vbCrLf & vbCrLf: Socket.SendData Emission.Text: Emission.Text = ""





DoEvents
End Sub





Pour la fermeture du timer et du socket.





Private Sub Form_Unload(Cancel As Integer)






    Socket.Close






        Do While CheckState_Timer.Enabled






        CheckState_Timer.Enabled = False






      
 Loop





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
21 oct. 2007 à 02:03
1) A quoi servent les @ et pourquoi les placer entre <>
à rien, tu fais juste une chaîne qui "ne risque" pas d'être saisie par l'utilisateur. c'est ton séparateur de fin (voir exemple ci dessous)

2) Je ne comprends pas la conception du « buffer » comme tu voudrais me le faire appliquer.
voir exemple ci dessous

3) Le DOEVENTS oui mais mon timer perd les pédales je crois que je ne l'emploie pas correctement.
normal il est inutile (voir exemple ci dessous)

4) Private Sub send_Click() (...)
tu sais que tu vas peut-être devoir relire ton code un jour.. tu vas t'y retrouver? ^^

5) Pour la fermeture du timer et du socket. (...)
tu fermes le socket avant le timer?
mais si tu as un TICK du timer avant, ce dernier va le re-connecter...

pas testé mais çà devrait être bon. j'ai séparé les "améliorations" dans des proc différentes pour bien différencier

Option Explicit
Private Const END_SEPAR As String = "~UNE_CHAÎNE_QUI_{ne sera pas saisie} PAR@L'UTILISATEUR~,
[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
21 oct. 2007 à 03:08
Merci beaucoup PTcp pour tes réponses et le travail effectué sur le code !<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>







C'est vraiment sympa de t'y attarder !







Quelques remarques sur un 1er test !







Le client cherche a se connecter automatiquement ! Donc j'ai lancé un serveur de test la connexion ce fait bien.







Les 3 remarques suivantes sont du au fait que tu n’est pas conservé le contenue du bouton Go est-ce volontaire ?







Le bouton Go « se connecter « ne fonctionne apparemment pas !  Impossible de déco le client du serveur.







Si je coupe le serveur le client  ce deco bien et affiche connexion terminée, mais si je relance le serveur impossible de reconnecter le client depuis le bouton Go je dois fermer l'appli client et la relancer.  









Le caption


de ce bouton Go qui affichait « se déconnecter » quand le client est connecté reste sur « se connecter »







Quand j'envois un message du client sur le serveur le message reçu par le serveur est suivit de ~UNE_CHAÎNE_QUI_{ne sera pas saisie} PAR@L'UTILISATEUR~, ...







Quand je veux répondre au client depuis le serveur le client ne rassoit pas la réponse
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
21 oct. 2007 à 03:10
oups désolé j'ai écorché ton pseudo PCPT milles excuses
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 oct. 2007 à 03:33
Le bouton Go « se connecter « ne fonctionne apparemment pas !  Impossible de déco le client du serveur.




vérifie au niveau du timer, le code existe toujours? je n'ai pas remis le code parce qu'il est inutile...

Si je coupe le serveur le client  ce deco
bien et affiche connexion terminée, mais si je relance le serveur
impossible de reconnecter le client depuis le bouton Go je dois fermer l'appli client et la relancer. 
je suppose que tu n'as pas géré le fait qu'au close serveur, ce dernier doit se remettre en écoute

la, ma, cette, etc.">Le caption de ce bouton Go qui affichait « se déconnecter » quand le client est connecté reste sur « se connecter »
comme tu peux le vois je ne me suis pas attardé à l'affichage, çà ne me semblait pas être dans les prérogatives ;)

Quand je veux répondre au client depuis le serveur le client ne rassoit pas la réponse
normal, tu as du oublier CÔTé SERVEUR d'envoyer le séparateur en fin d'envoi!!

c'est pas pour rien qu'au tout début je t'avais dis de faire le test sur une seule form avec 2 sockets :)
ne reporte pas les bugs, décortique ce que tu as sous la main

++
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 oct. 2007 à 03:34
les bugs* qui n'en sont pas! (évidemment)
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
21 oct. 2007 à 04:04
Tu peux trouver le client de base ici et le serveur la si tu veux tester « ils sont d’origines c’est seulement pour la partie graphique » donc tes modifications et améliorations n’y sont pas !



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






Vérifie au niveau du timer, le code existe toujours? Je n'ai pas remis le code parce qu'il est inutile...






Il est vrai que le timer quand on peut l’éviter c’est mieux !






 






Le code qui agissait sur le bouton Go est celui-ci :






 






'Si il est pas connecté le bouton connect et autorise le "transfert " (Else) si il est connecté mais pas de "transfert" en cours il deconnecte

If Socket.State 7 Then Go.Caption "Se déconnecter": send.Enabled = True: Exit Sub Else: send.Enabled = False
'Si il est connecté le bouton déconnectIf Socket.State 0 Then Go.Caption "Se connecter": Exit Sub
'si y a u ne transaction en cours, le bouton annule la transaction
Go.Caption = "Annuler"






 






Plus rien a voir avec la structure de ton code ! Mon événement est même Obsolète!






 







Je suppose que tu n'as pas géré le fait qu'au close serveur, ce dernier doit se remettre en écoute







 



Si mais ça ne va pas terrible j’ai des doublons en retour !






 







Comme tu peux le vois je ne me suis pas attardé à l'affichage, çà ne me semblait pas être dans les prérogatives ;)






J’aurais pu te donner le lien vers ces sources depuis le début cela aurait été plus simple dsl !






 







Normal, tu as du oublier CÔTé SERVEUR d'envoyer le séparateur en fin d'envoi!!






Ca c’est sur j’aurais une grosse étude de code après ! Car tu as fait de ma 4L une porche ou presque ! J’aurais sûrement 2 ou 3 questions  sur cette partie du projet !






 






Encore merci a toi
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
21 oct. 2007 à 08:23
Une 2eme version ici où j'ai implanté ton code et désactivé le contenue du timer et du bouton Go !


Mes tentatives pour rendre fonctionnel ce bouton n'aboutissent qu'à moitié ! Soit le bouton et bien sûr se déconnecter et passe a se connecter quand je deco mais reste bloquer  après ou c'est l'inversement.


Le séparateur en fin d'envoi sur le serveur la je bloque réellement.


Ce qui m'empêche de recevoir en client ce que le serveur envois


Pour infos les messages envoyer par le client sont du genre : headPan.val = 15;


Les réponses du serveur du genre : [139464:notag] 15.102466


La version de base du client et le serveur sont toujours disponibles dans mon poste précédent !

A bientot

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
21 oct. 2007 à 12:40
TOUS les points que j'ai indiqué se vérifient dans tes zips!

es-tu au final en train de me demander de tout refaire ? :$
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 oct. 2007 à 13:04
la suite ici stp, pas en MP

j'ai re-DL à l'instant, il n'y a QUE le client qui est MAJ!
relis mes comms, c'est au niveau du serveur que tu fais erreur...

quant à ta maj, pas grand chose de différent à part le registre (çà me plait pas çà...)

bref je te propose la chose suivant : te refaire un socket dédié pour urbi, basé sur CSOCKET de VBIP

pb : je vais manquer de temps aujourd'hui... mais j'aurai un peu de temps à partir de dimanche prochain

néanmoins HORS DE QUESTION de tout de faire
celà veut dire : REFAIT TON SERVEUR QUI NE CORRESPOND EN RIEN AUX MODIFS PRéCONISéES

@ te lite....
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
21 oct. 2007 à 14:15
Vu de ce que tu me proposes « refaire un socket dédié pour urbi, basé sur CSOCKET de VBIP »<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>



Je m’en vais dans un 1er temps collecter plus d’information vers le créateur d’urbi car seule le client sera en vb !





Le serveur urbi est directement installer sur une carte mère linux dans les robots.





On ne peut donc intervenir sur ce serveur !





Alors plutôt que d’adapter le serveur au client il me semble plus logique de faire l’inverse.





Le temps passer ces dernières heures n’est pas perdu il a permis de conforter certaine question sur la compatibilité du client par rapport au serveur.






 Comme tu me  l’as fait remarquer mon serveur d’origine ne répond plus vu qu’il ne gère pas  le séparateur en fin d'envoi !





Le serveur urbi on le sait peut dialoguer avec tous les langages ! il faut pour cela être capable d’envoyer une commande via le réseau (ouvrir une socket TCP/ip) et de recevoir des messages qu’on peux ensuite « parser », c'est-à-dire décomposer automatiquement en un header d’une part et un contenu d’autre part selon les dire du concepteur d’urbi.





Nous savon aussi que le therad n’est pas nécessaire qu’il est tous a fait possible de gérer  dans une boucle l’envoie, l’écoute puis le traitement





On a évoqué l’utilisation d’un buffer dans dataarrival pour les gros paquets





Le serveur gère t’il les gros paquets ? Ces paquets sont il envoyer en plusieurs fois dans certain cas ?





L’utilisation de séparateurs est elle supporté ?





On sait que les message a envoyer au serveur sont du genre  headPan.val = 15; et qu’il vas répondre quelque chose comme : [139464:notag] 15.102466.





Je penses que ces point sont un minimum a connaitre pour partir sur de bonne base !





PCPT si tu voix d’autre questions n’hésite pas je vais poser ces questions seulement demain matin.
A bientot
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 oct. 2007 à 15:03
[139464:notag] 15.102466.



tu peux demander si le message (après le header) se termine toujours par un POINT, et il contient toujours 2CHIFFRES_POINT_6CHIFFRES

çà ne change rien au fait que MÊME si le "serveur" (comme tu l'entends) utilise une structure immuable, il te faux bien une IHM faite en quelquechose...
0
Rejoignez-nous