Demande conseil avant projet backgroundworker

Signaler
Messages postés
66
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
26 mars 2019
-
Messages postés
16109
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 juillet 2021
-
Bonjour,


J'aimerais vous demander conseil avant de m'embarquer dans ce projet!

Le but

Je dois ramener depuis une api web des informations sur les films présents sur l'ordinateur de l'utilisateur.

Il y aura les titres qui ne posent pas de problèmes et qui seront ajouté directement
...et puis il y a ceux sur lesquels il y a un doute concernant le titre et où l'utilisateur devra intervenir pour choisir parmi une liste de proposition.

Les nécessités

Je voudrais que la recherche puisse se faire dans un backgroundworker pour, notamment, qu'une barre de progression et l'affichage du titre courant soient alimentés.
Quand il y a demande d'intervention de l'utilisateur, la liste des propositions est affichée dans un listview, dans l'interface principale.

Mon problème (et l'objet de ma question)

Comment dois-je m'y prendre pour que le backgroundworker (une boucle qui scanne tous les films présents et essaie de trouver une analogie avec la base de donnée WEB)
se mette en 'pause' d'une certaine façon, que les propositions soient affichées dans le listview (qui est sur le thread principal), que l'utilisateur puisse cliquer sur une des propositions
et que cette proposition soit retournée au backgroundworker ?

Il se peut que mon approche ne soit pas la bonne..et c'est aussi l'objet de ma demande de conseil! ;-)

Merci pour toute l'aide que vous voudrez bien me donner!!

1 réponse

Messages postés
16109
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 juillet 2021
554
Bonsoir,

je n'ai pas toutes les réponses, mais avec un backgroundworker, il est assez facile d'envoyer des infos de façon régulière au thread principal.
C'est d'ailleurs, prévu par défaut d'envoyer au moins un int qui alimente une progressBar.

Voici un exemple ou on compte jusqu'à 10^9.
A chaque pour-cent d'avancement, on envoie la nouvelle valeur de la progressBar et une information utilisateur (un caractère).
A la fin, on envoie le résultat (un string)

    Private Sub exempleBGW()
        Dim bgw As New BackgroundWorker()

        bgw.WorkerReportsProgress = True 'necessaire pour envoyer l'avancement du calcul

        AddHandler bgw.ProgressChanged, AddressOf bgw_ProgressChanged

        AddHandler bgw.DoWork, AddressOf bgw_DoWork 'abonne le BGW à la méthode qui fera le travail de fond.

        AddHandler bgw.RunWorkerCompleted, AddressOf bgw_RunWorkerCompleted 'abonne le BGW à la méthode qui sera éxécutée quand le travail sera finit

        bgw.RunWorkerAsync(1000000000.0) 'Démarre le travail de fond avec un paramètre
    End Sub

    Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
        Dim max As Integer = Convert.ToInt32(e.Argument)

        Dim caracteres() As Char = {"A"c, "B"c, "C"c, "D"c, "E"c, "F"c, "G"c, "H"c, "I"c, "J"c, "K"c, "L"c, "M"c, "N"c, "O"c, "P"c, "Q"c, "R"c, "S"c, "T"c, "U"c, "V"c, "W"c, "X"c, "Y"c, "Z"c, "a"c, "b"c, "c"c, "d"c, "e"c, "f"c, "g"c, "h"c, "i"c, "j"c, "k"c, "l"c, "m"c, "n"c, "o"c, "p"c, "q"c, "r"c, "s"c, "t"c, "u"c, "v"c, "w"c, "x"c, "y"c, "z"c, "A"c, "B"c, "C"c, "D"c, "E"c, "F"c, "G"c, "H"c, "I"c, "J"c, "K"c, "L"c, "M"c, "N"c, "O"c, "P"c, "Q"c, "R"c, "S"c, "T"c, "U"c, "V"c, "W"c, "X"c, "Y"c, "Z"c, "a"c, "b"c, "c"c, "d"c, "e"c, "f"c, "g"c, "h"c, "i"c, "j"c, "k"c, "l"c, "m"c, "n"c, "o"c, "p"c, "q"c, "r"c, "s"c, "t"c, "u"c, "v"c, "w"c, "x"c, "y"c, "z"c}


        For i As Integer = 0 To max - 1 'compte de zéro à la valeur passée en argument


            Dim j As Double = i * 100.0 / max
            If Math.Floor(i * 100.0 / max) = j Then
                CType(sender, BackgroundWorker).ReportProgress(CInt(Convert.ToInt32(j)), caracteres(CInt(Convert.ToInt32(j)))) 'quand on avance d'un %, envoie l'information d'avancement et une information personnelle
            End If
        Next i

        e.Result = "C'est fini!" 'définit un resultat
    End Sub

    Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
        progressBar1.Value = e.ProgressPercentage
        listBox1.Items.Add(e.UserState)
    End Sub

    Private Sub bgw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
        MessageBox.Show(CStr(e.Result))
    End Sub

    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
        exempleBGW()
    End Sub



Par contre, je ne sais pas mettre le traitement en pause et y envoyer une info.
Cela est possible avec un thread "normal".
Mais là je ne maitrise pas.
Modérer m'amène à intervenir dans de nombreux posts, mais les seuls langages que je connaisses sont le C# et un peu de VB. Pour vos codes pensez à la coloration.
Réponse trouvée ->Question Résolue