Ciao a tutti ragazzi!
Ho un ciclo che vorrei andasse avanti all'infinito, o meglio finchè non premo un tasto (ad esempio un tasto della tastiera o anche uno creato nel mio form)
Presumo debba ricorrere ai Thread no?
Ciao a tutti ragazzi!
Ho un ciclo che vorrei andasse avanti all'infinito, o meglio finchè non premo un tasto (ad esempio un tasto della tastiera o anche uno creato nel mio form)
Presumo debba ricorrere ai Thread no?
Ho provato a creare un nuovo thread, informandomi in giro...
Questo prima di tutto
Poi ho dichiarato questocodice:Imports System.Threading
Ho creato la Subcodice:Dim Th2 As New Threading.Thread(AddressOf thread2)
e infine con un tasto lo faccio partirecodice:Sub thread2() cont3 = 1005 Dim cont As Integer = 0 cont6 = 0 'ciclo per acquisizione/visualizzazione foto While cont <> 50 acquisisci(cont) cont = cont + 1 'System.Threading.Thread.Sleep(15) End While End Sub
Ho sbagliato qualcosa nel codice??codice:Th2.Start()
perchè quando premo il tasto mi esce questo:
Cross-thread operation not valid: Control 'IcImagingControl1' accessed from a thread other than the thread it was created on...
Più o meno ho capito cosa significa, ma non saprei come risolvere.
Praticamente è una telecamera che riprende, io devo fare delle foto, unirle e farle scorrere in tempo reale in una picturebox (e tutto questo funziona)
Il problema è che attualmente lo faccio andare per un tot di cicli stabiliti, invece vorrei far andare la visualizzazione in un thread a se in modo da poterlo far andare avanti all'infinito e quando voglio, premendo un tasto stop, fermarlo.
Ho visto che in teoria basta fare Thread.Abort, il punto è che sono bloccato a ben prima di fermarlo di mia volontà D:
Qualcuno saprebbe aiutarmi???
Ciao
il tuo è un problema abbastanza comune.
Di conseguenza anche la soluzione è trattata in diversi esempi su internet.
Cercando un minino si trova di tutto.
Vedi qua:
http://www.codeproject.com/Articles/...tion-not-valid
Ok grazie!
Nella sub MyThread1 devo scrivere il codice che voglio far eseguire al secondo thread vero??
E su AccessControl che devo scrivere
E in ogni caso, sarò stupido ma non ho ancora trovato la soluzione D:
Ma hai letto l'articolo? Hai capito qual'è l'errore che ti viene segnalato?
Il problema sta nel fatto che il tuo thread secondario che crei tu vuole accedere a un controllo gestito dal thread principale che lavora sulla GUI.
Quindi:
1) in myThread metti l'eventuale codice che prevede calcoli o elaborazione su oggetti creati all'interno di quel thread (o riferimenti a essi? CREDO)
2) in AccessControl puoi modificare i controlli della GUI, quindi la tua picturebox...
In ogni caso fai delle prove e se ancora non funziona posta qui il codice
ok e la parte di codice devo lasciarla??
Button2.Visible = True
Button3.Visible = True
Opacity = 1
ShowInTaskbar = True
Allora... con il codice non mi si presenta più l'errore, però la GUI non è comunque accessibile...
Il fine era quello di avere i pulsanti del mio form attivi mentre visualizzavo la picturebox, in modo da poterlo bloccare quando voglio
Rispetto alla tua risposta predecente,
era solo nell'esempio per far capire che il thread secondario riusciva a modificare le proprietà dei controlli gestiti dalla GUIcodice:Button2.Visible = True Button3.Visible = True
In ogni caso, se hai fatto le cose per bene, dovrebbe andare.. perché dici che la GUI non risulta accessibile? Il trucco dei 2 (o più thread) è proprio per questo, per far si che un thread secondario esegua del lavoro lasciando comunque l'interfaccia (e il thread che la gestisce) recettiva agli eventi.
Dovresti postare il codice.
Meglio ancora: guardati il controllo backgroundWorker
Definisci la sub Work, la fai partire e poi c'è l'evento di "aggiurnamento" della GUI, oltre a intercettare la richiesta di chiusura del Thread stesso..