5 messaggi dal 30 marzo 2017
Salve a tutti
sicuramente sono indietro nel capire vb2015 e mi(vi) chiedo una cosa :

si può associare il thread id al nome datogli prima di farlo partire ?

esempio :

TH_PROCON_CLOUD = New Thread(AddressOf PROCON_CLOUD)
TH_PROCON_CLOUD.Name = "PROCON_CLOUD"
'TH_PROCON_CLOUD.IsBackground = True
TH_PROCON_CLOUD.Priority = ThreadPriority.Highest
TH_PROCON_CLOUD.Start()

Il thread parte con un suo numero, che cambia ogni volta che riparte in caso finisca.
ora ... come faccio a capire che quel numero è relativo a questo thread e quindi capire se ancora gira o no ?

Sostanzialmente io vorrei capire quali threads sono in vita durante il running dell' exe.
Vorrei saperlo tramite il nome, perché se leggo "Il thread 0xe18 è terminato ..." non capisco quale degli X thread che girano si è fermato.

O c'è un altro mezzo per capire questa cosa ?
Scusate ancora la mia ignoranza.

Grazie
11.050 messaggi dal 09 febbraio 2002
Contributi
Ciao,


c'è un altro mezzo per capire questa cosa ?

Penso che i thread creati lì potresti aggiungere a una List(Of Thread), in modo da mantenere un riferimento ad essi. Poi, periodicamente, vai ad esaminare la lista per capire quali sono ancora vivi e quali no.

Nota al margine: usare la classe Thread direttamente è considerato un po' old-style da quando sono stati introdotti i Task. Infatti, se usassi un Task avresti un comodo metodo ContinueWith che ti permetterebbe di eseguire del codice non appena il Task termina (sia a causa di un errore che di normale fine esecuzione).

Ciao, Moreno

Enjoy learning and just keep making
5 messaggi dal 30 marzo 2017
grazie per la risposta
ho cercato in giro ma non ho trovato codici di esempio di entrambe le fattispecie (lista dei threads e task).
hai per caso sottomano qualche link specifico ?
grazie ancora
Modificato da fotosettore2 il 05 febbraio 2018 23.39 -
11.050 messaggi dal 09 febbraio 2002
Contributi
Ciao,
qui ci sono informazioni sulle List.
https://www.dotnetperls.com/list-vbnet

In pratica, dopo aver creato il thread, aggiungilo ad una lista.
TH_PROCON_CLOUD = New Thread(AddressOf PROCON_CLOUD)
TH_PROCON_CLOUD.Name = "PROCON_CLOUD"
TH_PROCON_CLOUD.Priority = ThreadPriority.Highest
TH_PROCON_CLOUD.Start()
'Aggiungo questo thread ad una lista
threads.Add(TH_PROCON_CLOUD)


Dove threads era stata definita così nella classe in cui hai messo il codice qui sopra.
Private threads As List(Of Thread) = New List(Of Thread)()


Poi, periodicamente, vai a scorrere la lista con un ciclo For per verificare quali thread sono ancora in esecuzione. Non riesco ad essere più specifico di così perché dovresti pubblicare più codice per poterlo applicare al tuo caso.

Qui invece ci sono degli esempi con i Task e il metodo ContinueWith di cui ti parlavo. In questo articolo troverai esempi in C# ma li puoi impostare su VB.NET agendo dal menu a tendina che trovi sulla destra.
https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/chaining-tasks-by-using-continuation-tasks

ciao,
Moreno
Modificato da BrightSoul il 05 febbraio 2018 23.57 -

Enjoy learning and just keep making
5 messaggi dal 30 marzo 2017
ciao moreno

per il discorso task mi hai dato un link interessantissimo e domani con calma lo leggo perché mi ha aperto una finestra su un nuovo mondo.

per i threads, ho seguito il tuo esempio, mettendo in lista i threads che man mano partono e poi ogni secondo (poi lo passerò ad 1 minuto) faccio eseguire :

Dim th As Integer
For th = 0 To threads.Count - 1
   Debug.Print("threads attivi " & threads.Item(th).Name)
Next th


vedo che li aggiunge ma ... se un thread finisce, rimane in lista.
Infatti ho un thread di nome "server", che agisce solo i primi 5 secondi di ogni minuto e poi termina.
Dopo 10 minuti è in lista 10 volte la stringa "server" ed invece dovrebbe apparirmi solo quando è attivo.
Questo accade perché ogni volta che riparte si rimette in lista ma il precedente (terminato) non viene eliminato.
Quindi : come faccio ad eliminarlo se termina da solo o se si blocca e quindi non è in ogni caso più attivo ?
Nel senso : la lista deve contenere solo i threads realmente funzionanti e non quelli terminati o bloccati (insomma non attivi).... una live-list :)

grazie per la tua pazienza
peppe
Modificato da fotosettore2 il 07 febbraio 2018 01.21 -
11.050 messaggi dal 09 febbraio 2002
Contributi
Ciao Peppe,


vedo che li aggiunge ma ... se un thread finisce, rimane in lista.

Sì, devi essere tu a rimuoverli quando non ti servono più. L'oggetto di tipo Thread ha le proprietà IsAlive e ThreadState che ti possono aiutare a capire se è il caso di rimuoverlo o no dalla lista.

Ad esempio:
Dim th As Integer
For th = threads.Count - 1 To 0 Step -1
   Dim thread = threads.Item(th)
   If thread.IsAlive Then
     Debug.Print("thread attivo " & thread.Name)
   Else 
     threads.Remove(thread)
     Debug.Print("thread rimosso " & thread.Name)
   End If
Next th



mettendo in lista i threads che man mano partono e poi ogni secondo (poi lo passerò ad 1 minuto) faccio eseguire :

Ok, quindi stai facendo due operazioni sulla lista: aggiungi elementi e li leggi. Attenzione perché l'oggetto List non è thread-safe e se stai facendo queste due operazioni da due thread separati avrai problemi di concorrenza. Per sicurezza userei un SyncLock per assicurarmi che aggiunta e lettura non avvengano in contemporanea, oppure passerei ad usare la classe ConcurrentDictionary che è thread-safe.

ciao,
Moreno
Modificato da BrightSoul il 07 febbraio 2018 13.07 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.