Backgroundworker Dowork [Résolu]

zaynoubagl 60 Messages postés mercredi 11 septembre 2013Date d'inscription 19 octobre 2014 Dernière intervention - 29 sept. 2014 à 14:59 - Dernière réponse : zaynoubagl 60 Messages postés mercredi 11 septembre 2013Date d'inscription 19 octobre 2014 Dernière intervention
- 30 sept. 2014 à 16:24
Bonjour, mon probleme comment le backgroundworker dowork exucuter le code sur le i precise


Imports System.Net.Sockets
Imports System.Net
Imports System.Threading
Imports System.IO
Imports System.Net.NetworkInformation
Imports System.ComponentModel
Imports System.Data.OleDb
Imports System.Diagnostics
Imports System.Object

Imports System.Windows


Public Class Form1

Private nblist As Integer
Dim bKW() As BackgroundWorker

Dim _ping As New Ping

Dim ligne As String
Dim ippoint() As IPEndPoint


Dim lvi As ListViewItem
Dim Conn, sql As String
Dim Cnx As OleDbConnection
Dim Cmd As OleDbCommand
Dim Dta As OleDbDataAdapter
Dim Dts As New DataSet
Dim Dtt As DataTable
Dim Rownum As Integer
Dim Dtr As DataRow
Dim Cmdb As OleDbCommandBuilder
Dim myIPAddress As System.Net.IPAddress
Dim p As Integer = 1314
Dim sk() As Socket


Dim pcourant As Integer
Delegate Sub dEcrit(ByVal Texte As String)
Private Sub Ecrit(ByVal Texte As String)
Me.ListBox1.Items.Add(Texte)

End Sub

Sub EcritureMessage(ByVal Message As String, Optional ByVal Type As Integer = 0)
Dim Texte As String = ""
Select Case Type
Case 1
Texte &= "INFO : "
Case 2
Texte &= "ERREUR : "
Case Else
End Select
Texte &= Message
Try
Me.Invoke(New dEcrit(AddressOf Ecrit), Texte)
Catch ex As Exception
Exit Sub
End Try
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Timer1.Enabled = True
Timer1.Start()

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click


connex()

End Sub


Sub ajouter2()

If bKW IsNot Nothing Then
For i = 0 To bKW.Count - 1
bKW(i) = New BackgroundWorker()
bKW(i).WorkerReportsProgress = True
bKW(i).WorkerSupportsCancellation = True
AddHandler bKW(i).DoWork, AddressOf DoWork

AddHandler bKW(i).ProgressChanged, AddressOf WorkerProgressChanged
AddHandler bKW(i).RunWorkerCompleted, AddressOf WorkerCompleted

bKW(i).RunWorkerAsync(i)


Next
End If
End Sub

Private Sub DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)

Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)




For i = 0 To sk.Count - 1 And ippoint.Count - 1
If sk(i).Connected Then
Dim Mess As Byte() = System.Text.Encoding.UTF8.GetBytes("@00R12*")
Dim Envoi As Integer = sk(i).Send(Mess)
Dim Bytes(255) As Byte
Dim Recu As Integer
Try
Recu = sk(i).Receive(Bytes)
Catch ex As Exception 'Erreur si fermeture du socket pendant la réception

'EcritureMessage("Deconnecté sur serveur.", 1)
End Try
Dim Message As String
Message = System.Text.Encoding.UTF8.GetString(Bytes)
Message = Message.Substring(0, Recu) + "" + ippoint(i).Address.ToString
EcritureMessage(Message)
Else

If Not sk(i).Connected Then
If _ping.Send(ippoint(i).Address.ToString).Status = IPStatus.Success Then
sk(i) = New System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
sk(i).Connect(ippoint(i))
EcritureMessage("Connexion reussite avec la carte!" + ippoint(i).Address.ToString, 1)


Else

EcritureMessage("Connexion non reussite avec la carte " + ippoint(i).Address.ToString, 2)

End If

System.Threading.Thread.Sleep(200)
End If

End If

Next


End Sub

Private Sub WorkerProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs)
' I did something!
End Sub

Private Sub WorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs)
' I'm done!
End Sub
Sub ajouter()
If ippoint Is Nothing Then
For i = 0 To ippoint.Count - 1
ippoint(i) = New IPEndPoint(IPAddress.Parse(ligne), p)
Next

End If

End Sub
Sub ajouter1()
If sk Is Nothing Then
For i = 0 To sk.Count - 1
sk(i) = New System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

Next

End If
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

Call ajouter2()

End Sub


Sub connex()
For i = 0 To sk.Count - 1 And ippoint.Count - 1
If _ping.Send(ippoint(i).Address.ToString).Status = IPStatus.Success Then
sk(i).Connect(ippoint(i))
EcritureMessage("Connexion reussite avec la carte!" + ippoint(i).Address.ToString, 1)


Else

EcritureMessage("Connexion non reussite avec la carte " + ippoint(i).Address.ToString, 2)
End If

Next
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim dr As OleDb.OleDbDataReader
Conn = "provider = microsoft.jet.oledb.4.0 ; data source =" & "C:\BDD.mdb"
Cnx = New OleDbConnection
Cnx.ConnectionString = Conn
Cnx.Open()
sql = "select Table_Equipements.Adr_IP from Table_Equipements"
Cmd = New OleDbCommand(sql)
Dta = New OleDbDataAdapter(Cmd)
Cmd.Connection() = Cnx
dr = Cmd.ExecuteReader
Dim ligne As String
While dr.Read()

' exploitation ligne courante
ligne = ""
For i = 0 To dr.FieldCount - 1
ligne += dr(i).ToString

If ippoint Is Nothing Then
ReDim ippoint(0)
Else

ReDim Preserve ippoint(ippoint.Count)
End If
If sk Is Nothing Then

ReDim sk(0)


Else
ReDim Preserve sk(sk.Count)

End If
If bKW Is Nothing Then

ReDim bKW(0)
Else
ReDim Preserve bKW(bKW.Count)

End If
ippoint(ippoint.Count - 1) = New IPEndPoint(IPAddress.Parse(ligne), p)
sk(sk.Count - 1) = New System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

bKW(bKW.Count - 1) = New BackgroundWorker()


ajouter()
ajouter1()

ajouter2()

Next i

End While


dr.Close()
End Sub
End Class
mon probleme que le backgroundworker parcour tout la liste a chaque fois
comment chaque backroundworker i dowork run sur sk(i)
si le i=1 run sk(1)
j'ai besoin d'un aide
Afficher la suite 

Votre réponse

10 réponses

jordane45 23176 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 13 novembre 2018 Dernière intervention - 29 sept. 2014 à 15:02
0
Merci
Bonjour,

Je n'ai pas vraiment compris ta question...
Déjà.. sur quelle partie EXACTEMENT de ton code rencontres tu un souci ?


Commenter la réponse de jordane45
zaynoubagl 60 Messages postés mercredi 11 septembre 2013Date d'inscription 19 octobre 2014 Dernière intervention - 29 sept. 2014 à 15:16
0
Merci
mon application fonctionne comme ca :
dams le laod de mon application
connect a ma base de donnée access
selectionner tous les adress ip dans ma table equipemment
a chaque selection d'une adress ip creer :
une liste dynamique des socket
une liste dynamique des IPendpoint
une liste dynamique d'un background worker

ajouter() pour la liste des socket
ajouter1() pour la liste des ipendpoint
ajouter2() pour la liste de bkw

les listes sont creer automatiquemment fonctionne bien
le problemme dans l'evennement dowork de chaque backgroundworker

je voulais quant je lance mon timer chaque backgroundworker do work execute sur sk(i) precise
bw(1).dowork sur sk(1)
Commenter la réponse de zaynoubagl
zaynoubagl 60 Messages postés mercredi 11 septembre 2013Date d'inscription 19 octobre 2014 Dernière intervention - 29 sept. 2014 à 15:19
0
Merci
le problemme ici


Private Sub DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)

Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)


'le i c'est mon problemme

' For i = 0 To sk.Count - 1 And ippoint.Count - 1
If sk(i).Connected Then
Dim Mess As Byte() = System.Text.Encoding.UTF8.GetBytes("@00R12*")
Dim Envoi As Integer = sk(i).Send(Mess)
Dim Bytes(255) As Byte
Dim Recu As Integer
Try
Recu = sk(i).Receive(Bytes)
Catch ex As Exception 'Erreur si fermeture du socket pendant la réception

'EcritureMessage("Deconnecté sur serveur.", 1)
End Try
Dim Message As String
Message = System.Text.Encoding.UTF8.GetString(Bytes)
Message = Message.Substring(0, Recu) + "" + ippoint(i).Address.ToString
EcritureMessage(Message)
Else

If Not sk(i).Connected Then
If _ping.Send(ippoint(i).Address.ToString).Status = IPStatus.Success Then
sk(i) = New System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
sk(i).Connect(ippoint(i))
EcritureMessage("Connexion reussite avec la carte!" + ippoint(i).Address.ToString, 1)


Else

EcritureMessage("Connexion non reussite avec la carte " + ippoint(i).Address.ToString, 2)

End If

System.Threading.Thread.Sleep(200)
End If

End If

' Next

zaynoubagl 60 Messages postés mercredi 11 septembre 2013Date d'inscription 19 octobre 2014 Dernière intervention - 29 sept. 2014 à 15:20
il prenne toujour le i=0
je voulais a chaque fois prendre le i precesise
jordane45 23176 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 13 novembre 2018 Dernière intervention - 29 sept. 2014 à 15:23
Tu as des paramètres (sender et e ) dans ta SUB
Private Sub DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)

Qu'est qu'ils valent lorsque tu entres dans ta SUB ?
zaynoubagl 60 Messages postés mercredi 11 septembre 2013Date d'inscription 19 octobre 2014 Dernière intervention - 29 sept. 2014 à 15:29
je voulais envoyer mon trame pour chaque socket connected
dans ma liste des socket sk()
Commenter la réponse de zaynoubagl
0
Merci
Salut,

La condition de ta boucle For Next
For i = 0 To sk.Count - 1 And ippoint.Count - 1
n'est pas correcte.
Si tu regardes msdn a propos de l'opérateur AND http://msdn.microsoft.com/en-us/library/sdbcfyzh.aspx tu t'apercevras que ta boucle ne s'exécutera qu'une fois puisque la valeur maximale obtenue avec l'opérateur AND est 1.

@jordane45
Peux tu me dire comment on indique un lien (url) lorsqu'on a pas de compte membre. Merci d'avance.
Ne pas tenir compte de ce message car ce n'est valable que lorsque l'expression est entre parenthèses. Veuillez excuser mon intrusion.
jordane45 23176 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 13 novembre 2018 Dernière intervention - 30 sept. 2014 à 14:31
Banana, pour mettre un LIEN il suffit d'utiliser les "[" "]"

[URL_DU_LIEN Nom_du_lien ]
Par exemple :
[http ://www.google.fr Google est mon ami ^^ ]
Google est mon ami ^^
zaynoubagl 60 Messages postés mercredi 11 septembre 2013Date d'inscription 19 octobre 2014 Dernière intervention - 30 sept. 2014 à 16:24
j'ai trouver la solution
donner un parametre pour mon background worker
et creer un argument dans l'evennemment do work
Commenter la réponse de banana32

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.