Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Rendre bloquante une fonction de controle active x

1 réponse
Avatar
Philippe
Bonjour a tous


J'ai un controle active x avec une fonction toto qui fait appelle à tcp qui
est un objet windock.

j'ai donc

public function toto() as long
....
....
tcp.connect
end function

j'ai une variable timeout qui peut etre réglé en millisecondes.

Je voudrais que ma fonction soit bloquante (pour des raisons personnelles).

C'est à dire que quand la fonction toto appelle tcp.connect, elle ne doit
pas rendre la main jusqu'a ce que l'evenement connect (ou error) de tcp se
declanche et doit ensuite donc renvoyer cette valeur.

Sauf si le timeout se declanche auquel cas il renvoye -1.

Auriez vous des tuyeaux pour me mettre sur la piste de comment bloquer
l'execution de la fonction jusqu'a ce qu'un evenement se declenche...?

Pour le second probleme je suppose que declencher un timer et bloquer la
fonction jusqu'a ce que le timer se déclenche est la solution, non ?

Merci.

1 réponse

Avatar
Jean-Marc
"Philippe" a écrit dans le message de
news:
Bonjour a tous


J'ai un controle active x avec une fonction toto qui fait appelle à tcp


qui
est un objet windock.

j'ai donc

public function toto() as long
....
....
tcp.connect
end function

j'ai une variable timeout qui peut etre réglé en millisecondes.

Je voudrais que ma fonction soit bloquante (pour des raisons


personnelles).

C'est à dire que quand la fonction toto appelle tcp.connect, elle ne doit
pas rendre la main jusqu'a ce que l'evenement connect (ou error) de tcp se
declanche et doit ensuite donc renvoyer cette valeur.

Sauf si le timeout se declanche auquel cas il renvoye -1.

Auriez vous des tuyeaux pour me mettre sur la piste de comment bloquer
l'execution de la fonction jusqu'a ce qu'un evenement se declenche...?



Hello,

Voici une bonne façon de faire. On utilise ici une variable globale
dont on utilise volontairement l'effet de bord pour détecter un
changement d'état.

Option Explicit
Const MY_TIMEOUT As Double = 5# ' 5 secondes de timeout
Dim G_CONNECTED As Boolean

Private Sub Command1_Click()
Dim Timeout_Reached As Boolean
Dim t_watch_dog As Double

Winsock1.RemoteHost = "www.google.com"
Winsock1.RemotePort = 80

' mettre RemotePort à 21 pour tester ce qui se passe en cas d'échec de
connection

t_watch_dog = Timer
Timeout_Reached = False
G_CONNECTED = False

Winsock1.Connect

While Not G_CONNECTED And Not Timeout_Reached
DoEvents
If (Timer - t_watch_dog) > MY_TIMEOUT Then
Timeout_Reached = True
End If
Wend
If G_CONNECTED Then
MsgBox "connection réussie."
Else
MsgBox "Pas de connection"
End If
End Sub


Private Sub Winsock1_Connect()
G_CONNECTED = True
End Sub

Et voila! Pas besoin d'un timer, c'est toujours pénible à débugger, et
pas très recommandé pour faire du TCP.

NOTE: en fait, utiliser l'évènement Connect n'est pas le top. Le plus
efficace est simplement de surveiller l'état de la connection en scrutant
dans la boucle While la valeur de Winsock1.State. Ce serait mieux et
éviterait l'emploi de la variable globale, ce qui est toujours mieux quand
on
peut, et ici, on peut.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;