Bonjour à tous,
J'aimerais programmer un sémaphore en VB.net. Je ne connaissais pas le
terme avant mais en fait en cherchant sur le net, j'ai trouvé que c'était
exactement ce qu'il me fallait :
http://mdalbin.developpez.com/tutoriels/general/semaphores/#L1.1
Sur cette page, il donne le code en Java. Il est relativement simple mais
je n'arrive pas à transcrire en VB.net 2-3 petits bouts.
En java, il donne ceci :
public class Semaphore
{
private int valeur;
private int limite;
public Semaphore(int valeur, int limite)
{
this.valeur=valeur;
this.limite=limite;
}
public int getValeur()
{
return valeur;
}
synchronized public void P()
{
while (valeur<1)
{
try
{
wait();
}
catch(InterruptedException e)
{
System.out.println("Erreur de Sémaphore");
}
}
valeur=valeur-1;
}
synchronized public void V()
{
valeur=valeur+1;
notify();
}
}
Les points dont je n'arrive pas à trouver l'équivalent en VB.net sont :
- la propriété "synchronized" des deux dernières procédures
- le "wait();"
- le "notify();" (mais je ne vois pas à quoi il sert)
Quelqu'un pourrait-il m'aider à transcrire cette classe bien utile en
VB.net ?
Merci d'avance,
Cordialement,
Bull
Bonjour à tous,
J'aimerais programmer un sémaphore en VB.net. Je ne connaissais pas le
terme avant mais en fait en cherchant sur le net, j'ai trouvé que c'était
exactement ce qu'il me fallait :
http://mdalbin.developpez.com/tutoriels/general/semaphores/#L1.1
Sur cette page, il donne le code en Java. Il est relativement simple mais
je n'arrive pas à transcrire en VB.net 2-3 petits bouts.
En java, il donne ceci :
public class Semaphore
{
private int valeur;
private int limite;
public Semaphore(int valeur, int limite)
{
this.valeur=valeur;
this.limite=limite;
}
public int getValeur()
{
return valeur;
}
synchronized public void P()
{
while (valeur<1)
{
try
{
wait();
}
catch(InterruptedException e)
{
System.out.println("Erreur de Sémaphore");
}
}
valeur=valeur-1;
}
synchronized public void V()
{
valeur=valeur+1;
notify();
}
}
Les points dont je n'arrive pas à trouver l'équivalent en VB.net sont :
- la propriété "synchronized" des deux dernières procédures
- le "wait();"
- le "notify();" (mais je ne vois pas à quoi il sert)
Quelqu'un pourrait-il m'aider à transcrire cette classe bien utile en
VB.net ?
Merci d'avance,
Cordialement,
Bull
Bonjour à tous,
J'aimerais programmer un sémaphore en VB.net. Je ne connaissais pas le
terme avant mais en fait en cherchant sur le net, j'ai trouvé que c'était
exactement ce qu'il me fallait :
http://mdalbin.developpez.com/tutoriels/general/semaphores/#L1.1
Sur cette page, il donne le code en Java. Il est relativement simple mais
je n'arrive pas à transcrire en VB.net 2-3 petits bouts.
En java, il donne ceci :
public class Semaphore
{
private int valeur;
private int limite;
public Semaphore(int valeur, int limite)
{
this.valeur=valeur;
this.limite=limite;
}
public int getValeur()
{
return valeur;
}
synchronized public void P()
{
while (valeur<1)
{
try
{
wait();
}
catch(InterruptedException e)
{
System.out.println("Erreur de Sémaphore");
}
}
valeur=valeur-1;
}
synchronized public void V()
{
valeur=valeur+1;
notify();
}
}
Les points dont je n'arrive pas à trouver l'équivalent en VB.net sont :
- la propriété "synchronized" des deux dernières procédures
- le "wait();"
- le "notify();" (mais je ne vois pas à quoi il sert)
Quelqu'un pourrait-il m'aider à transcrire cette classe bien utile en
VB.net ?
Merci d'avance,
Cordialement,
Bull
En java, il donne ceci :
Les points dont je n'arrive pas à trouver l'équivalent en VB.net so nt :
- la propriété "synchronized" des deux dernières procédures
- le "wait();"
- le "notify();" (mais je ne vois pas à quoi il sert)
En java, il donne ceci :
Les points dont je n'arrive pas à trouver l'équivalent en VB.net so nt :
- la propriété "synchronized" des deux dernières procédures
- le "wait();"
- le "notify();" (mais je ne vois pas à quoi il sert)
En java, il donne ceci :
Les points dont je n'arrive pas à trouver l'équivalent en VB.net so nt :
- la propriété "synchronized" des deux dernières procédures
- le "wait();"
- le "notify();" (mais je ne vois pas à quoi il sert)
En java, il donne ceci :
Les points dont je n'arrive pas à trouver l'équivalent en VB.net sont :
- la propriété "synchronized" des deux dernières procédures
- le "wait();"
- le "notify();" (mais je ne vois pas à quoi il sert)
En java, il donne ceci :
Les points dont je n'arrive pas à trouver l'équivalent en VB.net sont :
- la propriété "synchronized" des deux dernières procédures
- le "wait();"
- le "notify();" (mais je ne vois pas à quoi il sert)
En java, il donne ceci :
Les points dont je n'arrive pas à trouver l'équivalent en VB.net sont :
- la propriété "synchronized" des deux dernières procédures
- le "wait();"
- le "notify();" (mais je ne vois pas à quoi il sert)
Bonjour Zazar,
Merci beaucoup pour ta réponse mais hélas, je bloque toujours. Au lieu du
Monitor, j'avais utilisé l'objet Mutex mais le résultat est le même hélas.
Voici comment j'ai traduit la classe Semaphore en VB.net :
Imports System
Public Class Semaphore
Private freeSlotsMonitor As Monitor
Private freeSlots As Integer
'constructor which initializes and sets the mutexes
Public Sub New(ByVal threadLimit As Integer)
freeSlots = threadLimit
End Sub
Public Sub Acquire()
Try
freeSlotsMonitor.Enter(Me)
While freeSlots <= 0
freeSlotsMonitor.Wait(Me)
End While
freeSlots -= 1
Catch ex As Exception
MsgBox(ex.Message)
Finally
freeSlotsMonitor.Pulse(Me)
freeSlotsMonitor.Exit(Me)
End Try
End Function
'release the mutex locked by the thread
Public Sub Release(ByVal slot As Integer)
Try
freeSlotsMonitor.Enter(Me)
freeSlots += 1
Finally
freeSlotsMonitor.Exit(Me)
End Try
End Sub
End Class
Maintenant, le problème vient peut être de comment je l'emploie. Voici
quelques explications :
J'ai une classe dont une méthode "launchThread" est lancée. Cette dernière
en fait par le biais d'une boucle FOR lance dans un ThreadPool X fois la
méthode "works". Dans cette méthode, je fais tout d'abord un :
semaphore.Acquire()
Puis, je mets mes lignes de code. Et enfin, je fais un :
semaphore.Release()
Merci d'avance,
--
Cordialement,
Bull
"Zazar" a écrit dans le message
de news:
Bonjour,En java, il donne ceci :
<snip code>Les points dont je n'arrive pas à trouver l'équivalent en VB.net sont :
- la propriété "synchronized" des deux dernières procédures
Le mot-clef synchronized empêche que 2 threads appellent simultanément
l'une ou l'autre des méthodes. En VB.NET, on peut avoir ce comportement
avec la classe Monitor. Au début de chacune des méthodes, il suffit de
mettre un :
Monitor.Enter(me)
et à la fin
Monitor.Exit(me).
Aprés il faut s'assurer qu'à chaque enter corresponde bien un leave : un
try/Finally est fortement conseillé.- le "wait();"
- le "notify();" (mais je ne vois pas à quoi il sert)
Le wait sur un objet bloque le thread courant jusqu'à ce qu'un autre
thread fasse un notify sur le même objet
Les équivalents .NET sont Monitor.Wait(object) et Monitor.Pulse(object).
Bon courage,
--
Zazar
Bonjour Zazar,
Merci beaucoup pour ta réponse mais hélas, je bloque toujours. Au lieu du
Monitor, j'avais utilisé l'objet Mutex mais le résultat est le même hélas.
Voici comment j'ai traduit la classe Semaphore en VB.net :
Imports System
Public Class Semaphore
Private freeSlotsMonitor As Monitor
Private freeSlots As Integer
'constructor which initializes and sets the mutexes
Public Sub New(ByVal threadLimit As Integer)
freeSlots = threadLimit
End Sub
Public Sub Acquire()
Try
freeSlotsMonitor.Enter(Me)
While freeSlots <= 0
freeSlotsMonitor.Wait(Me)
End While
freeSlots -= 1
Catch ex As Exception
MsgBox(ex.Message)
Finally
freeSlotsMonitor.Pulse(Me)
freeSlotsMonitor.Exit(Me)
End Try
End Function
'release the mutex locked by the thread
Public Sub Release(ByVal slot As Integer)
Try
freeSlotsMonitor.Enter(Me)
freeSlots += 1
Finally
freeSlotsMonitor.Exit(Me)
End Try
End Sub
End Class
Maintenant, le problème vient peut être de comment je l'emploie. Voici
quelques explications :
J'ai une classe dont une méthode "launchThread" est lancée. Cette dernière
en fait par le biais d'une boucle FOR lance dans un ThreadPool X fois la
méthode "works". Dans cette méthode, je fais tout d'abord un :
semaphore.Acquire()
Puis, je mets mes lignes de code. Et enfin, je fais un :
semaphore.Release()
Merci d'avance,
--
Cordialement,
Bull
"Zazar" <DILAVNI.nicolas.prats@gmail.com.INVALID> a écrit dans le message
de news: OPxz94SOFHA.3880@tk2msftngp13.phx.gbl...
Bonjour,
En java, il donne ceci :
<snip code>
Les points dont je n'arrive pas à trouver l'équivalent en VB.net sont :
- la propriété "synchronized" des deux dernières procédures
Le mot-clef synchronized empêche que 2 threads appellent simultanément
l'une ou l'autre des méthodes. En VB.NET, on peut avoir ce comportement
avec la classe Monitor. Au début de chacune des méthodes, il suffit de
mettre un :
Monitor.Enter(me)
et à la fin
Monitor.Exit(me).
Aprés il faut s'assurer qu'à chaque enter corresponde bien un leave : un
try/Finally est fortement conseillé.
- le "wait();"
- le "notify();" (mais je ne vois pas à quoi il sert)
Le wait sur un objet bloque le thread courant jusqu'à ce qu'un autre
thread fasse un notify sur le même objet
Les équivalents .NET sont Monitor.Wait(object) et Monitor.Pulse(object).
Bon courage,
--
Zazar
Bonjour Zazar,
Merci beaucoup pour ta réponse mais hélas, je bloque toujours. Au lieu du
Monitor, j'avais utilisé l'objet Mutex mais le résultat est le même hélas.
Voici comment j'ai traduit la classe Semaphore en VB.net :
Imports System
Public Class Semaphore
Private freeSlotsMonitor As Monitor
Private freeSlots As Integer
'constructor which initializes and sets the mutexes
Public Sub New(ByVal threadLimit As Integer)
freeSlots = threadLimit
End Sub
Public Sub Acquire()
Try
freeSlotsMonitor.Enter(Me)
While freeSlots <= 0
freeSlotsMonitor.Wait(Me)
End While
freeSlots -= 1
Catch ex As Exception
MsgBox(ex.Message)
Finally
freeSlotsMonitor.Pulse(Me)
freeSlotsMonitor.Exit(Me)
End Try
End Function
'release the mutex locked by the thread
Public Sub Release(ByVal slot As Integer)
Try
freeSlotsMonitor.Enter(Me)
freeSlots += 1
Finally
freeSlotsMonitor.Exit(Me)
End Try
End Sub
End Class
Maintenant, le problème vient peut être de comment je l'emploie. Voici
quelques explications :
J'ai une classe dont une méthode "launchThread" est lancée. Cette dernière
en fait par le biais d'une boucle FOR lance dans un ThreadPool X fois la
méthode "works". Dans cette méthode, je fais tout d'abord un :
semaphore.Acquire()
Puis, je mets mes lignes de code. Et enfin, je fais un :
semaphore.Release()
Merci d'avance,
--
Cordialement,
Bull
"Zazar" a écrit dans le message
de news:
Bonjour,En java, il donne ceci :
<snip code>Les points dont je n'arrive pas à trouver l'équivalent en VB.net sont :
- la propriété "synchronized" des deux dernières procédures
Le mot-clef synchronized empêche que 2 threads appellent simultanément
l'une ou l'autre des méthodes. En VB.NET, on peut avoir ce comportement
avec la classe Monitor. Au début de chacune des méthodes, il suffit de
mettre un :
Monitor.Enter(me)
et à la fin
Monitor.Exit(me).
Aprés il faut s'assurer qu'à chaque enter corresponde bien un leave : un
try/Finally est fortement conseillé.- le "wait();"
- le "notify();" (mais je ne vois pas à quoi il sert)
Le wait sur un objet bloque le thread courant jusqu'à ce qu'un autre
thread fasse un notify sur le même objet
Les équivalents .NET sont Monitor.Wait(object) et Monitor.Pulse(object).
Bon courage,
--
Zazar
Private freeSlotsMonitor As Monitor
Private freeSlots As Integer
'constructor which initializes and sets the mutexes
Public Sub New(ByVal threadLimit As Integer)
freeSlots = threadLimit
End Sub
Public Sub Acquire()
Try
freeSlotsMonitor.Enter(Me)
While freeSlots <= 0
freeSlotsMonitor.Wait(Me)
End While
freeSlots -= 1
Catch ex As Exception
MsgBox(ex.Message)
Finally
freeSlotsMonitor.Pulse(Me)
Private freeSlotsMonitor As Monitor
Private freeSlots As Integer
'constructor which initializes and sets the mutexes
Public Sub New(ByVal threadLimit As Integer)
freeSlots = threadLimit
End Sub
Public Sub Acquire()
Try
freeSlotsMonitor.Enter(Me)
While freeSlots <= 0
freeSlotsMonitor.Wait(Me)
End While
freeSlots -= 1
Catch ex As Exception
MsgBox(ex.Message)
Finally
freeSlotsMonitor.Pulse(Me)
Private freeSlotsMonitor As Monitor
Private freeSlots As Integer
'constructor which initializes and sets the mutexes
Public Sub New(ByVal threadLimit As Integer)
freeSlots = threadLimit
End Sub
Public Sub Acquire()
Try
freeSlotsMonitor.Enter(Me)
While freeSlots <= 0
freeSlotsMonitor.Wait(Me)
End While
freeSlots -= 1
Catch ex As Exception
MsgBox(ex.Message)
Finally
freeSlotsMonitor.Pulse(Me)
Private freeSlotsMonitor As Monitor
Private freeSlots As Integer
'constructor which initializes and sets the mutexes
Public Sub New(ByVal threadLimit As Integer)
freeSlots = threadLimit
End Sub
Public Sub Acquire()
Try
freeSlotsMonitor.Enter(Me)
While freeSlots <= 0
freeSlotsMonitor.Wait(Me)
End While
freeSlots -= 1
Catch ex As Exception
MsgBox(ex.Message)
Finally
freeSlotsMonitor.Pulse(Me)
Private freeSlotsMonitor As Monitor
Private freeSlots As Integer
'constructor which initializes and sets the mutexes
Public Sub New(ByVal threadLimit As Integer)
freeSlots = threadLimit
End Sub
Public Sub Acquire()
Try
freeSlotsMonitor.Enter(Me)
While freeSlots <= 0
freeSlotsMonitor.Wait(Me)
End While
freeSlots -= 1
Catch ex As Exception
MsgBox(ex.Message)
Finally
freeSlotsMonitor.Pulse(Me)
Private freeSlotsMonitor As Monitor
Private freeSlots As Integer
'constructor which initializes and sets the mutexes
Public Sub New(ByVal threadLimit As Integer)
freeSlots = threadLimit
End Sub
Public Sub Acquire()
Try
freeSlotsMonitor.Enter(Me)
While freeSlots <= 0
freeSlotsMonitor.Wait(Me)
End While
freeSlots -= 1
Catch ex As Exception
MsgBox(ex.Message)
Finally
freeSlotsMonitor.Pulse(Me)
Bonsoir,
Merci pour ta réponse. Mais ça ne fonctionne toujours pas correctement.
J'ai toujours pour la grande majorité de mes threadPool l'exception
suivante qui est levée : Message "Le nombre de threads libres dans
l'objet ThreadPool n'est pas suffisant pour terminer l'opération. " String
Une idée sur comment l'éviter ?
Merci d'avance,
--
Cordialement,
Bull
"Zazar" a écrit dans le message
de news:
Bonsoir,
<...>
Private freeSlotsMonitor As Monitor
Vous n'avez pas besoin d'une variable de type Monitor, vous n'utilisez
que des méthodes shared ici.
Private freeSlots As Integer
'constructor which initializes and sets the mutexes
Public Sub New(ByVal threadLimit As Integer)
freeSlots = threadLimit
End Sub
Public Sub Acquire()
Try
freeSlotsMonitor.Enter(Me)
While freeSlots <= 0
freeSlotsMonitor.Wait(Me)
End While
freeSlots -= 1
Catch ex As Exception
MsgBox(ex.Message)
Finally
freeSlotsMonitor.Pulse(Me)
L'appel à Pulse() est mal placé, il doit avoir lieu dans la méthode
Release() (comme la méthode notify() en java).
--
Zazar
Bonsoir,
Merci pour ta réponse. Mais ça ne fonctionne toujours pas correctement.
J'ai toujours pour la grande majorité de mes threadPool l'exception
suivante qui est levée : Message "Le nombre de threads libres dans
l'objet ThreadPool n'est pas suffisant pour terminer l'opération. " String
Une idée sur comment l'éviter ?
Merci d'avance,
--
Cordialement,
Bull
"Zazar" <DILAVNI.nicolas.prats@gmail.com.INVALID> a écrit dans le message
de news: uA2eC6fOFHA.3928@TK2MSFTNGP09.phx.gbl...
Bonsoir,
<...>
Private freeSlotsMonitor As Monitor
Vous n'avez pas besoin d'une variable de type Monitor, vous n'utilisez
que des méthodes shared ici.
Private freeSlots As Integer
'constructor which initializes and sets the mutexes
Public Sub New(ByVal threadLimit As Integer)
freeSlots = threadLimit
End Sub
Public Sub Acquire()
Try
freeSlotsMonitor.Enter(Me)
While freeSlots <= 0
freeSlotsMonitor.Wait(Me)
End While
freeSlots -= 1
Catch ex As Exception
MsgBox(ex.Message)
Finally
freeSlotsMonitor.Pulse(Me)
L'appel à Pulse() est mal placé, il doit avoir lieu dans la méthode
Release() (comme la méthode notify() en java).
--
Zazar
Bonsoir,
Merci pour ta réponse. Mais ça ne fonctionne toujours pas correctement.
J'ai toujours pour la grande majorité de mes threadPool l'exception
suivante qui est levée : Message "Le nombre de threads libres dans
l'objet ThreadPool n'est pas suffisant pour terminer l'opération. " String
Une idée sur comment l'éviter ?
Merci d'avance,
--
Cordialement,
Bull
"Zazar" a écrit dans le message
de news:
Bonsoir,
<...>
Private freeSlotsMonitor As Monitor
Vous n'avez pas besoin d'une variable de type Monitor, vous n'utilisez
que des méthodes shared ici.
Private freeSlots As Integer
'constructor which initializes and sets the mutexes
Public Sub New(ByVal threadLimit As Integer)
freeSlots = threadLimit
End Sub
Public Sub Acquire()
Try
freeSlotsMonitor.Enter(Me)
While freeSlots <= 0
freeSlotsMonitor.Wait(Me)
End While
freeSlots -= 1
Catch ex As Exception
MsgBox(ex.Message)
Finally
freeSlotsMonitor.Pulse(Me)
L'appel à Pulse() est mal placé, il doit avoir lieu dans la méthode
Release() (comme la méthode notify() en java).
--
Zazar