Errore in multithread + errore con l'uso di un timer!

giovedì 22 maggio 2008 - 14.47

sankyu Profilo | Senior Member

ciao a tutti posto il codice che si fa prima ed alla fine vi descrivo i problemi!

Delegate Sub aggiornaLabel(ByVal attivo As Boolean)
Public Class Form1
Private Sub btnStart45_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart45.Click
Dim temp As New temporizza(lblStato45)
End Sub

Private Sub btnStart3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart3.Click
Dim temp As New temporizza(lblStato3)
End Sub

Private Sub btnGo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGo.Click
' Control.CheckForIllegalCrossThreadCalls = False
End Sub
End Class
Public Class temporizza
Private lbl As Label
Dim tr As New System.Threading.Thread(AddressOf Start)
Dim WithEvents tmr As New Timers.Timer
Dim del As aggiornaLabel = New aggiornaLabel(AddressOf cambiaStato)
Public Sub New(ByVal aLbl As Label)
Me.lbl = aLbl
End Sub
Public Sub Start()
AddHandler tmr.Elapsed, AddressOf OnTick
del.Invoke(False)
tmr.Interval = 5000
tmr.Enabled = True
End Sub
Public Sub OnTick(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)
tmr.Stop()
del.Invoke(True)
For i As Integer = 1 To 586506
Math.Sqrt(54684618655.2)
Next
tmr.Start()
del.Invoke(False)
End Sub

Public Sub cambiaStato(ByVal attivo As Boolean)
If attivo Then
lbl.Text = "Attivo"
lbl.BackColor = Color.Green
Else
lbl.Text = "Caricamento"
lbl.BackColor = Color.Yellow
End If
End Sub

End Class

Problemi:
1- l'evento Ontick del timer non viene mai lanciato(ho provato anche mettendo tmr.start ed utilizzando la classe timer al posto di quella timers.timer ma non cambia nulla)
2-non riesco a far funzionare in multi thread(va solo chiamando Control.CheckForIllegalCrossThreadCalls = False ma non mi sembra una bella cosa!) ho provato con le delegate ma mi sa che non ho ancora ben capito come si usano!!!

help !!!
grazie a tutti

Brainkiller Profilo | Guru

>1- l'evento Ontick del timer non viene mai lanciato(ho provato
>anche mettendo tmr.start ed utilizzando la classe timer al posto
>di quella timers.timer ma non cambia nulla)
>2-non riesco a far funzionare in multi thread(va solo chiamando
>Control.CheckForIllegalCrossThreadCalls = False ma non mi sembra
>una bella cosa!) ho provato con le delegate ma mi sa che non
>ho ancora ben capito come si usano!!!

Ciao,
in questo caso non pensi sia molto più semplice utilizzare il controllo Timer ? Quello che trascini sulla Form ? Fa la stessa funzione e non ti crei tutti i casini del multithreading.

Il codice parzialmente è corretto, set dell'intervallo, abilitazione del Timer enabled, ecc., poi usi degli Invoke che io non ho mai usato in questo scenario.

Poi magari se ci spieghi anche cosa dovrebbe fare questo codice, vedo nel Tick un ciclo lunghissimo e un calcolo di radice ?
Ciao

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

sankyu Profilo | Senior Member

il programma sarà un client ftp che deve inviare ripetutamente più archivi a diversi destinatari in contemporanea e con timing indipendenti l'uno dall'altro
esempio:

thread 1

1 : invia il file
2 : attendi 5 secondi
controlla per nuovi file
if nuovifile=true torna a 1
else
torna a 2

fine thread 1

thread 2
stessa cosa di thread 1 e cosi per n thread

ogni thread deve essere indipendente dato che esegue pesanti query sql e voglio sfruttare al meglio gli 8 core del server inoltre se un ftp si blocca deve riportare l'errore tramite sms server ma gli altri devono andare avanti a fare il loro lavoro; la form principale conterrà solo un riepilogo degli stati dei vari ftp ecco il motivo della funzione cambia stato ed ecco i problemi.
il timer voglio imparare ad usarlo!!!(con quello della toolbox funziona ma non riuscirei ad integrarlo in una classe indipendente nel caso in cui voglio riusarla)

la delegata se ho capito serve a fare in modo che il passaggio di dati tra la mia classe che contiene il thread nuovo e la classe form1 nn creino dei problemi ma non ho ben capito come usarla(finora le usavo solo per tenere pulito il codice)

la radice quadrata mi serve per simulare l'invio ftp, sto ancora testando il tutto per capire come fare prima di iniziare !!

-----------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1-----------------------------------

Risolta la parte che riguarda le delegate!! capito il problema e come usarle! rimane il problema del timer quello non riesco proprio a sistemarlo

Brainkiller Profilo | Guru

>Risolta la parte che riguarda le delegate!! capito il problema
>e come usarle! rimane il problema del timer quello non riesco
>proprio a sistemarlo

Non c'è bisogno del timer in questo caso è sufficiente lanciare un Thread e il codice metterlo dentro un ciclo do while esempio:

do { //condizione IF //codice da eseguire per upload Thread.Sleep(5000); } while (continua==true);

Lo sleep addormenta il Thread per 5 secondi. Il ciclo continua fino a quando continua è = true. Quando in base ai tuoi controlli stabilisci che il Thread deve chiudersi imposti continua = false.

Questa è la tecnica che si usa per fare quello che tu hai spiegato.

Ciao

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

sankyu Profilo | Senior Member

Grazie!!! il dubbio su come usare la classe timer rimane però! se mai lo scopro lo posto! ciao!

Brainkiller Profilo | Guru

>Grazie!!! il dubbio su come usare la classe timer rimane però!
>se mai lo scopro lo posto! ciao!

Copia e incolla questo codice e vedrai che funziona:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/
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