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

Windows Forms Discussion :

[C#] Bakckground Worker et operations Thread Safe


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Juin 2006
    Messages : 73
    Points : 58
    Points
    58
    Par défaut [C#] Bakckground Worker et operations Thread Safe
    Bonjour,

    J'ai fait un programme qui parcours le disque dur recursivement pour renommer des fichiers. Le traitement se fait dans un backgroundWorker, qui fait un reporting de l'etat d'avancement (progressbar) et qui peut etre abandonné (canceled).

    J'ai 2 problemes :

    1.
    au fur et à mesure de l'avancement, je construit un log des actions réalisées en ajoutant des lignes dans une listbox. Mais je ne peut pas faire un add sur les items d'une liste box dans mon background worker car ce n'est pas thread safe. Comment le faire proprement ? j'ai lu pas mal de truc là dessus mais l'implémentation de la solution reste encore un peu obscure pour moi :-(

    2.
    Comme dans beaucoup d'applications qui écrivent un log, j'aimerai pouvoir :
    - soit via un mode "scroll lock" ajouter des lignes dans ma listbox sans que le scroller ne descende automatiquement (facile, c'est le fonctionnement par défaut des listbox)
    - soit avoir un défilement automatiquement de ma liste box au fur et a mesure que j'y ajoute des lignes (ce que j'ai essayé de faire grosso modo en selectionnant le dernier item de la liste box à chaque fois que j'y ajoute une ligne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    resultListBox.Items.Add(logs);
    resultListBox.SetSelected(resultListBox.Items.Count - 1, true);
    resultListBox.SetSelected(resultListBox.Items.Count - 1, false);
    resultListBox.Refresh();
    Avez vous une autre idée que d'aller selectionner le dernier élément de la liste à chaque ajout pour simuler un "auto scroll" ? ou dois-je plutot utiliser un autre composant ? le tout devant fonctionner en thread safe dans le background worker.

    merci d'avance pour vos lumières.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Juin 2006
    Messages : 73
    Points : 58
    Points
    58
    Par défaut
    bon j'ai résolu le probleme du thread safe pour accéder à l'UI depuis le background worker.

    Mon background worker utilisait cette méthode qui mettait à jour l'UI (avec un plantage dûe au probleme de thread safe) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            private void addLogs(String logs) {
                    // Update the UI
                    resultListBox.Items.Add(logs);
                    if (!scrollLockCheckBox.Checked) {
                        resultListBox.SetSelected(resultListBox.Items.Count - 1, true);
                        resultListBox.SetSelected(resultListBox.Items.Count - 1, false);
                    }
                    resultListBox.Refresh();
            }
    pour rendre le tout thread safe, voici ce que j'ai changé :
    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
     
            public delegate void addLogsDelegate(String logs);
     
            private void addLogs(String logs) {
                if (InvokeRequired) {
                    Invoke(new addLogsDelegate(addLogs), new object[] { logs });
                } else {
                    // Update the UI
                    resultListBox.Items.Add(logs);
                    if (!scrollLockCheckBox.Checked) {
                        resultListBox.SetSelected(resultListBox.Items.Count - 1, true);
                        resultListBox.SetSelected(resultListBox.Items.Count - 1, false);
                    }
                    resultListBox.Refresh();
                }
            }

  3. #3
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Bein je te resoud donc le probleme de de la ListBox :

    [VB.Net 2.0/ListBox] Comment rendre visible une Item sélectionné ?
    Mehdi Feki : Modérateur .Net

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

Discussions similaires

  1. [RCP] Treeviewer non thread-safe ?
    Par Guildux dans le forum Eclipse Platform
    Réponses: 4
    Dernier message: 09/01/2007, 13h00
  2. fonction de stdio.h thread safe ??
    Par boolzor dans le forum POSIX
    Réponses: 3
    Dernier message: 30/04/2006, 20h03
  3. Code "Thread Safe" ?
    Par Neitsa dans le forum C++
    Réponses: 3
    Dernier message: 23/12/2005, 14h33
  4. [Language]Immutable & Thread-Safe
    Par Repti dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 21/12/2005, 15h50
  5. [MFC] CMAP non thread safe ?
    Par fmarot dans le forum MFC
    Réponses: 5
    Dernier message: 04/10/2005, 13h21

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