Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

Gestire il Multithreading (basilare) [Guida]
(Questo messaggio è stato modificato l'ultima volta il: 26/08/2011, 17:54 da Luca360.)

Iscritto
Messaggi: 63
Discussioni: 6
Registrato: 04-2011
Mix: 0
Il multithreading consente di non "bloccare" il programma durante la sua esecuzione da cicli infiniti o da cose che richiedono molto tempo.

[COLOR="#FFFFFF"]Stavo tentando anche di capire e realizzare un progetto che sfruttasse più thread per eseguire un solo lavoro ma qualcosa è andato storto.[/COLOR]

In questa guida, Spiegherò come affiancare al thread principale altri thread secondari che gestiscano cicli o altro.

Per realizzare un nuovo thread, prima cosa occorre creare una sub che conterrà le istruzioni che vogliamo che vengano svolte su un thread differente.

Codice:
Sub esempio()
        Dim x As Integer
        Do Until x = 1000000
            x += 1
            Label1.Text = x
            Me.Refresh()
        Loop
    End Sub

Questa sub di esempio, in cui utilizzo una label ed un Do in una form, durante la sua esecuzione bloccherà il programma. Questo perchè il programma porta a termine una richiesta alla volta, in questo caso di aumentare una variabile di 1, sostituire il testo della label ed aggiornarsi. poichè lavora solamente come "una persona" ovvero con un solo thread.
Ora faremo in modo di dare una mano al programma, fornendogli un'aiutante ovvero un thread secondario che esegua una parte del lavoro chiesto al programma.

Inseriamo al di fuori della sub questo.

Codice:
Dim ThreadSecondario As System.Threading.Thread

Questo inizializza una nuovo thread.

Ora, dobbiamo assegnare qualcosa da fare a questo Thread.
Perciò, inseriamo questo :

Codice:
ThreadSecondario = New Threading.Thread(AddressOf Me.esempio)
        ThreadSecondario.Start()

dobbiamo inserire questo però quando vogliamo che il thread inizi ad operare ad esempio alla pressione di un button, all'accensione di un timer o quant'altro.
Quì, Stiamo dicendo al nostro thread secondario che è stato delegato nell'eseguire esempio() ovvero la nostra sub. [COLOR="#FF0000"]New Threading.Thread(AddressOf Me.esempio)[/COLOR]
Infine con [COLOR="#FF0000"]ThreadSecondario.Start()[/COLOR] diciamo al thread di cominciare ad eseguire ciò che gli è stato assegnato. in questo caso la nostra cara sub di esempio.
Con [COLOR="#FF0000"]ThreadSecondario.Abort()[/COLOR] invece terminiamo il thread.

Ora, se lasciassimo il lavoro così, verrebbe generata un'eccezione [COLOR="#FF0000"](Operazione cross-thread non valida)[/COLOR] in quanto ogni thread deve lavorare unicamente su ciò che crea. Ad esempio nel caso della label che è stata creata dal thread principale,
il thread secondario non può metterci mano.

Per Evitare questo, Possiamo "Evitare" il controllo sulla chiamata di thread differenti attraverso questo :
(Risparmiandoci milioni di deleghe rompiminchia :Asd: )
Codice:
Me.CheckForIllegalCrossThreadCalls = False

Che effettivamente essendo un booleano, ed essendo impostato ora su Falso, non controllerà più, permettendo chiamate illegali fra i vari thread. (Tranquilli, non andate in galera :Asd: )

Quest'ultimo source deve essere "Eseguito" prima dell'attivazione degli altri thread altrimenti genererà la odiata eccezione.
Consiglio, di inserirlo nel load della form.

Con questa guida e specificatamente utilizzando più thread, potrete utilizzare il System.threading.thread.sleep che vi eviterà l'utilizzo di vagonate di timer oltre all'evitare che
Si blocchi l'applicazione durante un download o durante una ricerca, aumentando incredibilmente la stabilità e la fluidità del programma.
Se non l'avete capito, per chi lo conosce, Buttate Application.doEvents() nel cesso :Asd:

Spero vi torni utile la guida, il multithreading a me ha cambiato il metodo di programmazione, rendendo molto più veloci i miei lavori.
[COLOR="#F0FFFF"]
Crediti By Luca360 Se non Li lasciate vi spezzo le gambe Happywide[/COLOR]

19/08/2011, 22:55
#1
Cerca

Coder
Messaggi: 633
Discussioni: 57
Registrato: 04-2011
Mix: 0
bella guida! +1

PS: hai letto qualche libro per fare queste guide?

20/08/2011, 0:27
#2
Cerca

WarRock Hacks Coder
Messaggi: 940
Discussioni: 47
Registrato: 03-2011
Mix: 0
uno snipett del codice finale dell'applicazione che esegue il thread? giusto per fare il confronto col primo che non lo aveva Smile

20/08/2011, 8:35
#3
Cerca

Iscritto
Messaggi: 63
Discussioni: 6
Registrato: 04-2011
Mix: 0
non ho letto nulla per fare ste guide, mi son arrangiato più o meno xD

Sky ti post entrambe le applicazioni una con il multi e l'altra solo su thread principale, vedrai da solo la differenza xD

20/08/2011, 12:58
#4
Cerca

Iscritto
Messaggi: 891
Discussioni: 58
Registrato: 03-2011
Mix: 0
Bravo... cmq hai sbagliato non è [color="#FFFFFF"]...

ma

Codice:
[color=#FFFFFF]...[/color]




20/08/2011, 13:01
#5
Cerca

Coder
Messaggi: 633
Discussioni: 57
Registrato: 04-2011
Mix: 0
(20/08/2011, 12:58)Luca360 Ha scritto:

[Per vedere i link devi REGISTRARTI.]

non ho letto nulla per fare ste guide, mi son arrangiato più o meno xD

Sky ti post entrambe le applicazioni una con il multi e l'altra solo su thread principale, vedrai da solo la differenza xD

non è ke me ne potresti inviare una copia anche a me? Tounge

20/08/2011, 13:42
#6
Cerca

Iscritto
Messaggi: 63
Discussioni: 6
Registrato: 04-2011
Mix: 0
Qui c'è sia l'esempio con il multithreading sia senza.

Download :

[Per vedere i link devi REGISTRARTI.]



20/08/2011, 13:57
#7
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 20/08/2011, 14:04 da Cato97.)

Coder
Messaggi: 633
Discussioni: 57
Registrato: 04-2011
Mix: 0
mercì

EDIT: cassarola se si nota la differenza Asd

20/08/2011, 14:00
#8
Cerca


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  [Guida] Cambiare lingua ad un gioco che utilizza una lingua di sistema Cato97 10 59,629 25/08/2017, 16:46
Ultimo messaggio: Romolo
  Futura guida Python Pocciox 8 3,655 13/06/2013, 20:25
Ultimo messaggio: Pocciox
  [Guida] Guida passo-passo: C++ Hack Nomenu digger 70 19,779 26/01/2013, 17:58
Ultimo messaggio: digger



Utenti che stanno guardando questa discussione: 1 Ospite(i)