Rendre bloquante une fonction de controle active x
1 réponse
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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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_' ;
"Philippe" <a@a.a> a écrit dans le message de
news:3l6jdrF119ftkU1@individual.net...
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
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_' ; _no_spam_jean_marc_n2@yahoo.fr
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
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_' ;