Operazione cross-thread non valida

lunedì 23 aprile 2007 - 14.43

PEPE Profilo | Senior Member

Salve a tutti,
è la prima volta che mi cimento nella programmazione WinForm e con i thread :D.

Ho visto una guida sul sito della microsoft molto semplice ed intuitiva su come avviare un thread in background

http://support.microsoft.com/kb/315577/it

Ho eseguito tutti i passi ma ottengo il seguente errore:
Operazione cross-thread non valida: è stato eseguito l'accesso al controllo 'ProgressBar1' da un thread diverso da quello da cui è stata eseguita la creazione.

Sono andato a vedere un po di help e ho visto che una delle soluzioni è impostare la proprietà del controllo CheckForIllegalCrossThreadCalls a False.
http://msdn2.microsoft.com/en-us/library/ms171728.aspx

Tutto funziona correttamente ma mi sembra un po una "zozzata". Dato che ho visto che esiste la possibilità di effettuare operazioni con i thread in safe-mode, volevo sapere come potevo trasformare il codice dell'esempio che ho provato in questa modalità.

Grazie in anticipo,
Luca.

alextyx Profilo | Expert

Forse potrebbe essereti utile questo lavoretto:

http://forum.masterdrive.it/showthread.php?t=17282

Burty Profilo | Newbie

Ciao
Se mi fai vedere il codice dopo l' evento della progress bar provo a scrivertelo in thread safe ,
il concetto e che devi delegare una funzione che esegue il codice che tu chiami direttamente dal il thread secondario , perchè con la chiamata diretta ci sarebbero due thread che gestiscono lo stesso controllo , te puoi ignorare la gestione dell' errore, ma creeresti una applicazione potenzialmente instabile.

PEPE Profilo | Senior Member

Ciao,
allora guardando un po di esempi in giro sono riuscito a capire come usare il delegate (lol) per non incorrere in quell'errore.
Adesso vorrei tanto capire come fare a far riniziare la progressbar quando arriva alla fine (tipo un ciclo infinito).
Ho tentato di fare una bozza di programma ma va in errore perche dice che il valore della progressbar supera 100 che è il valore massimo :(

Ecco il codice, magari avete un po di pazienza :D:D:D:D.

Imports System.Threading

Public Class Form1

Private trd As Thread
Private Delegate Sub ChangeUpdateBarDelegate(ByVal val As Int32)

Private Sub Button1_Click( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button1.Click
MessageBox.Show(Me.ProgressBar1.Maximum)
End Sub

Private Sub ThreadTask()
Do
Me.ChangeUpdateBar(Me.ProgressBar1.Value)
Thread.Sleep(100)
Loop
End Sub

Private Sub ChangeUpdateBar(ByVal val As Int32)
If Me.InvokeRequired Then
Me.Invoke(New ChangeUpdateBarDelegate(AddressOf ChangeUpdateBar), Me.ProgressBar1.Value)
Else
Dim stp As Integer = Me.ProgressBar1.Value
If stp > Me.ProgressBar1.Maximum Then
Me.ProgressBar1.Value = 0
Else
stp = stp + 10
Me.ProgressBar1.Value = stp
End If
End If
End Sub


Private Sub Form1_Load( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
Me.trd = New Thread(AddressOf ThreadTask)
Me.trd.IsBackground = True
Me.trd.Start()
End Sub

End Class


Grazie 1000,
Luca.

Burty Profilo | Newbie

Se lo fai il debug passo passo guardando i valori di stp mi lo dovresti vedere bene l' errore...

comunque se usi il framework 2 per fare un operazione del genere usa l' oggetto backgroudworker
è stato itrodotto a posta ed è facile da usare.

PEPE Profilo | Senior Member

Grazie 1000 per l'aiuto...mi metto subito a vedere l'oggetto che mi hai consigliato di usare.

Ciao 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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5