IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[VB.NET] Thread


Sujet :

ASP.NET

  1. #1
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut [VB.NET] Thread
    Bonjour à tous,

    voici mon problème,

    je voudrais lancer un thread qui tourne en tache de fond à partir de mon webservice, mais je voudrais le lancer que s'il n'existe pas déjà et une seule instance (le relancer s'il est terminé donc ou s'il n'a pas été encore démarré, le faire, sinon ne rien faire).

    Quelle est la meilleure solution ? un singleton ? il y a peut-etre des méthodes toutes faites ? Sur quoi faire la synchronisation ?

    Merci de m'aiguiller, n'y connaissant pas grand chose en thread ...

  2. #2
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    salut nico (Tu t'es trompé de forum ?)

    Tout simplement, dispose tu d'un objet membre de type System.Threading.Thread dans ta classe ?

    Si oui tu n'a qu'à tester si cet objet est null ou (non null et Thread.IsAlive = False)
    Note que tu ne peux redémarrer un Thread terminé. Il faut à chaque fois créer une nouvelle instance et faire un Thread.Start.

    Pour la synchronisation tu peux te créer un objet membre static exprès pour cela.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static private Object SyncObj = new Object();
    J'espère que ça répond à ta question

    P.S : 2 trois trucs sur les threads http://faqcsharp.developpez.com/?page=thread

  3. #3
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    salut Abelman, merci pour ta réponse.

    Cependant, j'éprouve quelques difficultés.

    j'ai donc un objet membre thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private checkMessageThread As System.Threading.Thread
    que j'initialise lors de l'appel à mon webservice
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            If checkMessageThread Is Nothing Then
                checkMessageThread = New System.Threading.Thread(AddressOf Me.checkMessage)
                checkMessageThread.Start()
            End If
    le but étant qu'il appelle la fonction checkMessage à chaque fois que ce web service est appelé (sauf si la fonction tourne déja en tache de fond).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Private Sub checkMessage()
            SyncLock SyncObj
                'traitement un peu long
                'fin du traitement
                checkMessageThread.Abort()
            End SyncLock
        End Sub
    sachant que l'objet de syncro est défini comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Private SyncObj As New Object
    Sauf qu'à chaque fois que j'appelle mon web service, je suppose que checkMessageThread est réinstancié dans un nouveau processus, donc il ne peut pas savoir si le thread est déjà lancé ou pas. Peut-etre faut-il utiliser une mémoire partagée, mais n'y a-t-il pas une autre architecture plus adaptée ?

    Merci

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    a moins qu'un mutex soit plus adapté pour ce que je veux faire ...

    Qu'en pensez-vous ?

  5. #5
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Ok je vois.

    Pour quoi n'utilise tu pas le ThreadPooling couplé à un évènement ?
    Exple
    Déclare un membre static

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        'Une classe équivalente au CEvent de MFC. Signalé à l'initialisation
        Private Shared CheckMessageNotActiveEvent As New ManualResetEvent(True)
    puis pour appeller ta fonction CheckMessage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            'Attente équivalente à un WaitForSingleObject(h, INFINITE)
            'Tu peux gerer un TimeOut dans l'attente
            If CheckMessageNotActiveEvent.WaitOne() Then
                'Un thread system va exécuter ta fonction si l'evt notActive est pas signalé
                ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf CheckMessage), Nothing)
            End If
    Enfin voici le corps de la fonction CheckMessage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Shared Sub CheckMessage(ByVal state As Object)
     
            Try
                'Reseter l'evt ici
                CheckMessageNotActiveEvent.Reset()
     
                'Ton code
     
            Finally
                'Signaler l'evenement à la sortie de la fonction dans tous les cas.!
                CheckMessageNotActiveEvent.Set()
            End Try
     
        End Sub

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    et bien, ma foi, ca m'a l'air de bien fonctionner ca

    Merci bien pour ces infos Mister Abelman (nouvelement promu !), et puis je vais gérer effectivement un TimeOut comme il faut.

    Encore merci

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET] thread interrompu lors d'une fermeture de form ?
    Par HULK dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/01/2006, 15h00
  2. [vb.net][Thread] Basculer entre Thread
    Par arnolem dans le forum Windows Forms
    Réponses: 5
    Dernier message: 06/01/2006, 18h59
  3. [VB.Net][Threading] Problème de parent ...
    Par maitrebn dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/01/2006, 11h05
  4. [VB.net] Thread avec paramètres
    Par WriteLN dans le forum Windows Forms
    Réponses: 4
    Dernier message: 19/04/2005, 17h42
  5. [VB.NET] Threads et paramètres
    Par moufles03 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/10/2004, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo