2010-10-12 3 views
0

J'utilise des threads d'arrière-plan pour exécuter des processus de recherche intenses afin de permettre à l'interface utilisateur d'être entièrement accessible. Après la création de chaque bgw, je mets à jour un datagridview qui montre les différents threads et l'état actuel. Cependant, une fois qu'ils ont terminé, je n'ai aucun moyen ou au moins je ne connais pas un moyen de mettre à jour le statut sur le datagridview spécifique à chaque arrière-plan.état actuel du fond d'écran

Try 
     bgw.RunWorkerAsync() 
     queuelist.Enqueue(bgw) 
     If Not Thread.CurrentThread.Name = "Main Thread" Then 
      Dim record As String() = {jobNum, clientProj & jobNum, jobStartTime, bgw.IsBusy.ToString} 
      DataGridView1.Rows.Add(record) 
     End If 

    Catch ex As Exception 
     MessageBox.Show("An Error Occured:" & vbNewLine & ex.Message) 
    End Try 

Détermine le datagridviewer une fois que les discussions commencent, mais une fois qu'il se termine, je ne sais pas comment mettre à jour ou de savoir quel thread a pris fin. J'ai essayé de les mettre dans une file d'attente mais je ne peux pas identifier un ouvrier spécifique quand je dequeue.

des idées

Répondre

1

Je ne comprends vraiment pas pourquoi vous feriez les détails de mise en œuvre, comme les travailleurs de fond visibles sur l'interface utilisateur. Eh bien, du code. Cela n'a pas de sens d'utiliser une file d'attente, les threads ne se terminent pas dans un ordre prévisible. Faisons une liste:

Dim workerList As New List(Of BackgroundWorker) 

Vous voulez profiter de l'événement RunWorkerCompleted soulevée par BGW savoir quand le travail est fait. Il faut donc utiliser AddHandler:

Dim bgw As New BackgroundWorker 
    AddHandler bgw, AddressOf DoSomeWork 
    AddHandler bgw, AddressOf WorkDone 
    workerList.Add(bgw) 
    '' Do something with the grid 
    ''... 
    bgw.RunWorkerAsync() 

Et le gestionnaire d'événements peut ressembler à ceci:

Private Sub WorkDone(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) 
    If e.Error IsNot Nothing Then Throw e.Error 
    Dim bgw = DirectCast(sender, BackgroundWorker) 
    workerList.Remove(bgw) 
    '' Do something with the grid 
End Sub 
+0

Merci pour la réponse et BTW, je dois afficher chaque processus en cours d'exécution sur l'interface utilisateur que l'état actuel de chaque emploi comme ceci: jobId jobname starttime status – vbNewbie

Questions connexes