PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Socket et Thread
Socket et Thread
Iniciado por nicolas.cabrie, 19,feb. 2020 10:31 - 2 respuestas
Publicado el 19,febrero 2020 - 10:31
Bonjour,

pour un client je dois utiliser des sockets.

J'ai un bouton qui me permets de créer un socket + thread:

SI ThreadEtat("THREAD_Event") <> threadInexistant ALORS
ThreadArrête("THREAD_Event")
FIN

SI SocketExiste("Serveur") ALORS
SocketFerme("Serveur")
FIN

SocketCrée("Serveur",55561,"192.168.0.1")

ThreadExecute("THREAD_Event",threadNormal,THREAD_Event)


La procédure THREAD_Event réalise une boucle :

BOUCLE
SI SocketAttendConnexion("Serveur") = Vrai ALORS
Trace("Socketconnect OK")
sCanal = SocketAccepte("Serveur")

SocketChangeModeTransmission(sCanal,SocketMarqueurFinBuffer,Caract(Null))

BOUCLE
m++
Trace("Boucle XML : "+m)
//Récupère le message
sXMLTemp = SocketLit(sCanal,Vrai)

SI sXMLTemp <> "" ALORS
Event.XML = sXMLTemp
HAjoute(Event)

AnalyseXML(sXMLTemp)

sXMLTemp = ""
FIN

FIN
FIN

FIN


En Go dans Windev ca marche au premier lancement.
J'ai un autre bouton pour fermer le socket et tuer le thread.
Si je reclique sur mon bouton initial qui crée le thread et le socket alors ca ne fonctionne plus.
Il semblerait que SocketAttendConnexion soit toujours faux.

Pour que ca refonctionne je dois stopper mon test dans Windev puis relancer en Go.
Auriez-vous une idée de pourquoi ca marche au premier coup mais plus ensuite ?

Merci
Miembro registrado
4 mensajes
Publicado el 19,febrero 2020 - 15:21
Bonjour,

Déjà évite les boucles sans sortie.
Met un time out sur ton SocketAttendConnexion
Pour arrêter ton thread, ajoute une variable global
et dans ton thread si ta variable globale est à vrai alors arrête ton thread avec Thread fin

Procedure MaFenêtre()

GLOBAL
gbArret est un booléen


SI ThreadEtat("THREAD_Event") <> threadInexistant ALORS
gbArret = Vrai
FIN

SI SocketExiste("Serveur") ALORS
SocketFerme("Serveur")
FIN

SocketCrée("Serveur",55561,"192.168.0.1")

ThreadExecute("THREAD_Event",threadNormal,THREAD_Event)
.

BOUCLE
SI gbArret ALORS
SORTIR
FIN
SI SocketAttendConnexion("Serveur",10) = Vrai ALORS
Trace("Socketconnect OK")
sCanal = SocketAccepte("Serveur")

SocketChangeModeTransmission(sCanal,SocketMarqueurFinBuffer,Caract(Null))

BOUCLE
SI gbArret ALORS
SORTIR
FIN
m++
Trace("Boucle XML : "+m)
//Récupère le message
sXMLTemp = SocketLit(sCanal,Vrai)

SI sXMLTemp <> "" ALORS
Event.XML = sXMLTemp
HAjoute(Event)

AnalyseXML(sXMLTemp)

sXMLTemp = ""
FIN

FIN
FIN
ThreadFin()
FIN
Publicado el 20,febrero 2020 - 12:11
Bonjour,

merci pour ce retour, j'ai appliqué tes conseils mais cela ne solutionne pas mon problème.
Apres arret, la re création du socket + thread se fait bien mais SocketAttendConnexion est toujours faux
Je ne comprends pas