System.Timers.Timer

lunedì 11 luglio 2005 - 13.26

trinity Profilo | Guru

Ragazzi mi trovo in un problema che non riesco a trovare un'uscita...
io ho un Thread che esegue una connessione remota ad un server web e poi uploda dei file video, qui funziona tutto. Io ho voluto implementare il servizio facendo vedere contemporaneamente i byte trasferiti e qui nasce il problema, come vedrete nel codice che vi ho postato io utilizzo la classe System.Timers.Timer per avviare un timer che controlla i byte uplodati, solo che se il risultato lo assegno ad una label sulla fom non funziona, mentre se lo assegno ad una msgbox frunziona perfettamente..Navigando sulla rete mi hanno detto di utilizzare il metodo Invoke, mi hanno dato degli esempi ma non sono riuscito a capire bene la sua funzione. Con il codice che vi ho postato mi potete far vedere dove sbaglio e darmi una soluzione?

Ciao e grazie
Fabio

CODICE:

Private avvio As New System.Threading.Thread(AddressOf sendfile)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim avvio As New System.Threading.Thread(AddressOf sendfile)
avvio.Start()
End Sub

Private Sub sendfile()
SyncLock (Me)
Me.Panel1.Visible = True
Dim connesso As Boolean
connesso = InternetGetConnectedState(0&, 0&)
Dim cn As Integer
InternetGetConnectedState(cn, 0&)
If connesso = True Then
Try
Cursor.Current = Cursors.WaitCursor
Me.Label3.Text = "Inserimento metadati in corso..."
System.Windows.Forms.Application.DoEvents()
REM set_file()
Dim str As String
str = "c:\pltv\flvmdi.exe " & Me.Label2.Text & " /eCopyright-Provincialatina.tv"
Dim result As Integer
result = Shell(str, AppWinStyle.MinimizedFocus, True)
System.Windows.Forms.Application.DoEvents()
If result = 0 Then
Me.Label3.Text = "Trasferimento in corso..."
End If
System.Windows.Forms.Application.DoEvents()
conn.setRemoteHost("000.000.0000.00")
conn.setRemotePort(21)
conn.setRemoteUser("prova") : conn.setRemotePass("prova")
conn.chdir("video")
System.Windows.Forms.Application.DoEvents()
Dim p As New System.Timers.Timer
AddHandler p.Elapsed, AddressOf prova
p.Interval = 1000
p.Enabled = True
System.Windows.Forms.Application.DoEvents()
conn.upload(Me.Label2.Text)
conn.chdir("")
conn.close()
System.Windows.Forms.Application.DoEvents()
Cursor.Current = Cursors.Default
Me.Panel1.Visible = False
MsgBox("Trasferimento terminato con successo", MsgBoxStyle.Information)
avvio.Abort()
Catch
MsgBox(Err.Description)
p.Stop()
p.Enabled = False
conn.chdir("")
conn.close()
Cursor.Current = Cursors.Default
Me.Panel1.Visible = False
Exit Sub
End Try
Me.Panel2.Visible = True
System.Windows.Forms.Application.DoEvents()
Dim fr As New Form2
fr.caricadb()
System.Windows.Forms.Application.DoEvents()
Me.Panel2.Visible = False
fr.ShowDialog(Me)
Else
MsgBox("Attenzione connessione internet non attiva, impossibile collegarsi al server", Msg

Brainkiller Profilo | Guru

Ciao,
io di solito procedo così. Creo un ThreadStart che punta a una funzione contenuta nella form. Creo un Thread a cui passo il ThreadStart appena creato e faccio partire il thread con il metodo Start.

Nella funzione puntata da TheadStart hai accesso agli oggetti della Form. Non ti garantisco però che sia thread safe.

ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

trinity Profilo | Guru

potresti farmi vedere un esempio in base al codice che ho postato?

Ciao

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5