Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Operazione cross-thread non valida
lunedì 23 aprile 2007 - 14.43
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
PEPE
Profilo
| Senior Member
296
messaggi | Data Invio:
lun 23 apr 2007 - 14:43
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
668
messaggi | Data Invio:
lun 23 apr 2007 - 16:20
Forse potrebbe essereti utile questo lavoretto:
http://forum.masterdrive.it/showthread.php?t=17282
Burty
Profilo
| Newbie
9
messaggi | Data Invio:
mar 24 apr 2007 - 13:09
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
296
messaggi | Data Invio:
gio 26 apr 2007 - 21:41
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
9
messaggi | Data Invio:
ven 27 apr 2007 - 12:21
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
296
messaggi | Data Invio:
sab 28 apr 2007 - 09:21
Grazie 1000 per l'aiuto...mi metto subito a vedere l'oggetto che mi hai consigliato di usare.
Ciao ciao
Torna su
Stanze Forum
Elenco Threads
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 !