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

Framework .NET Discussion :

Blocage, thread et pipes


Sujet :

Framework .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 71
    Par défaut Blocage, thread et pipes
    Bonjour à tous,

    Pour mettre à jour des cours, mon programme lit des pages web pour en extraire les données qui m’intéressent, puis faire la mise à jour d’une base historique des cotations. L’inconvénient de ma solution utilisant un WebBrowser est le blocage de l’interface Form pendant toute la durée de l’opération. J’aurai aimé que celle-ci se fasse en background sans déranger l’utilisateur .

    J’ai donc réalisé une sub serveur dans le programme principal, quatre thread clients communiquant par pipes avec ce serveur, pour obtenir les références des données à chercher, puis demander les pages correspondantes et enfin renvoyer les données téléchargées.

    Je pensais ainsi résoudre ce blocage de l’interface utilisateur ! et bien NON

    Existe il une solution pour que l’asynchronisme des processus client et serveur garantisse le non blocage de l’interface ?

    La consommation cpu est inférieure à 5%, merci de vos conseils.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    la fonction serveur :
     
    Dim pipeServer_1 As New NamedPipeServerStream("pipe_isin_url_1", PipeDirection.Out, 4, PipeTransmissionMode.Byte, PipeOptions.Asynchronous)
     
    premier_thread()
    pipeServer_1.WaitForConnection()
    Dim ecrire_pipe_1 As New StreamWriter(pipeServer_1)
     
    ecrire_pipe_1.WriteLine(isin_titre(index_titre) + url_0_titre(index_titre))
    ecrire_pipe_1.Close()
     
    la définition du thread :
     
        Public Sub New(ByVal index_thread As Integer)
            thread_index = index_thread
     
        End Sub
     
        Private Sub premier_thread()
            Dim extraire_1 As New clsThread(1)
     
            Dim lire_un_cours As New Thread(AddressOf extraire_1.cotation)
            lire_un_cours.IsBackground = True
            lire_un_cours.Start()
     
        End Sub
     
    la classe client cotation,
     
    Public Sub cotation()
     
    Dim web_serveur As New System.Net.WebClient(), codeHTML As String, From_code As encoding
    Dim pipeClient As New NamedPipeClientStream(".", "pipe_isin_url_" + thread_index.ToString,         PipeDirection.In, PipeOptions.Asynchronous)
     
    pipeClient.Connect()
    Dim lire_pipe As New StreamReader(pipeClient)
     
    url_demande = lire_pipe.ReadLine()
    Dim page_html As New StreamReader(web_serveur.OpenRead(url_demande), From_code)
    codeHTML = page_html.ReadToEnd()
     
    End Sub

  2. #2
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    oulaaaaa, y'a une balise pour mettre du code tu sais ? C'est celle en forme de dièse (#)

    C'est trop la misère de faire une capture d'écran. Non seulement il faut ouvrir l'image pour lire le code mais en plus on ne peut rien copier/coller.

  3. #3
    Membre émérite Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Par défaut
    Ton interface tourne forcement dans un seule thread, tu ne peux pas interagir avec les éléments d'interface dans un thread secondaire.
    Tu peux par contre utiliser BackgroundWorker pour les taches ne nécessitant pas des objets de l'interface.
    Sinon tu n'est peut obligé d'utiliser le webBrowser si tu ne veux rien afficher à l'écran, tu peux implémenter une socket sur Http et récupérer la réponse et la parsée.

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par NicoL__ Voir le message
    Ton interface tourne forcement dans un seule thread, tu ne peux pas interagir avec les éléments d'interface dans un thread secondaire.
    On va présumer que tu veux dire les "controles". Et tu peux interagir avec eux parfaitement depuis un thread autre que celui qui les a créé, en utilisant la méthode Invoke sur le controle lui même (ou sur son parent).

  5. #5
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Si j'ai bien compris, ta solution actuelle n'utilise donc plus de contrôle webbrowser ? Bon et bien il n'y a aucune raison que ça bloque. Dans ce que tu as fourni, il n'y a aucun problème.

    Tu as vraisemblablement un traitement après l'assignation de "codeHtml", j'imagine que ça vient de là. Possible que ça vienne des pipes, je connais mal leur fonctionnement mais, à vue de nez, tout à l'air correct. Cela dit, il n'y avait absolument aucune raison d'utiliser des pipes ici alors que tu ne les utilises que pour transmettre des informations depuis le thread UI aux threads enfants, c'est inutilement lourd et rend ton code difficilement compréhensible au premier abord. Il y a plus simple pour ça, voir Thread.Start(Object arg).

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 71
    Par défaut solution
    Citation Envoyé par DonQuiche Voir le message
    Si j'ai bien compris, ta solution actuelle n'utilise donc plus de contrôle webbrowser ? Bon et bien il n'y a aucune raison que ça bloque. Dans ce que tu as fourni, il n'y a aucun problème.

    Tu as vraisemblablement un traitement après l'assignation de "codeHtml", j'imagine que ça vient de là. Possible que ça vienne des pipes, je connais mal leur fonctionnement mais, à vue de nez, tout à l'air correct. Cela dit, il n'y avait absolument aucune raison d'utiliser des pipes ici alors que tu ne les utilises que pour transmettre des informations depuis le thread UI aux threads enfants, c'est inutilement lourd et rend ton code difficilement compréhensible au premier abord. Il y a plus simple pour ça, voir Thread.Start(Object arg).
    bien vu, le diable était bien ailleurs!

    merci pour le conseil je l'ai mis en oeuvre aprés avoir fait marcher les pipes et la communication réseau à titre d'exercice

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

Discussions similaires

  1. Blocage Thread D7 FB1.5 DbExpress
    Par gudul dans le forum Bases de données
    Réponses: 4
    Dernier message: 01/06/2007, 09h14
  2. blocage threads glib
    Par hicham100 dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 19/04/2007, 17h43
  3. pipe / thread /process /abus de language
    Par emardjean dans le forum MFC
    Réponses: 4
    Dernier message: 17/01/2006, 14h20
  4. [Thread] Blocage dans mon programme
    Par Xo Sonic oX dans le forum EDT/SwingWorker
    Réponses: 4
    Dernier message: 18/06/2005, 17h12
  5. [THREAD] probleme de pipe
    Par mehdiyassin dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 01/07/2004, 13h50

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