Newsgroup: it.comp.lang.visual-basic
Titolo: Threads

in un vecchio post ho sentito parlare dei threads e l'altro giorno mi sono 
imbattuto in un caso in cui potrebbero esserrmi uitili. putroppo leggendone 
in rete il funzionamento non ne sono sicuro...  quello di cui ho bisogno � 
che il codice di una procedura si interrompa per un determinato periodo di 
tempo e riprendere dalla riga di codice successiva all'esecuzionde del 
thread... � possibile???
ovvero
Sub Test
[codice]
lancio il thread per un'attesa di tot secondi
[codice]
End Sub
mentre in rete sembrerebbe che un thread permetta di eseguire una procedura 
ogni tot secondi ovvero lo stesso risultato che di puo ottenere con un 
semplice timer.....

 wrote in
news:4ac112a7$0$827$
4faf...@reader5.news.tin.it
: 

informati un po' meglio.
un thread permette a un singolo programma di eseguire operazioni diverse 
contemporaneamente (descrizione spannometrica, eh...).
se quello che ti serve e' una pausa, la api sleep in vb6 o il thread.sleep 
in *.net dovrebbero essere sufficienti.
-- 
Paolo opg
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 ha scritto nel messaggio 
news:Xns9C957AA8AA91Fsp...@193.43.96.1...


 passo al .net...
Nessuno dei due "manda in pallone il PC"; fanno esattamente quello che
dicono di fare: interrompono completamente l'elaborazione del thread a
cui si riferiscono.
Questo vuol dire che il sistema operativo non concede nessuna % di CPU
al programma, e quindi gli impedisce di fare tutto, incluso per
esempio tutta la coda di messaggi per ridisegno dell'interfaccia
grafica; questo, al 99%, è quello che sospetto tu abbia etichettato
come "impallare il PC", e che è invece del tutto normale, e a cui si
rimedia banalmente.
Come ti hanno detto, dal tuo esempio pare che tu voglia fare semplice
pausa, e non aprire un nuovo thread, quindi, anche in VB6, è
sufficente Sleep.
Se la tua pausa è relativamente lunga, e vuoi evitare che il programma
sembri bloccato, non devi fare altro che spezzarla in pause più brevi,
durante le quali fai un Refresh o chiami DoEvents
Confronta l'effetto di questi due spezzoni:
Sub Pausa()
    'codice
    Sleep 10000 '10 secondi di pausa continua
    'codice
End Sub
Sub Pausa()
    'codice
    For i = 1 To 10
        Sleep 1000 '10 pause da 1 secondo, con ritorno di CPU tra una
e l'altra
        DoEvents
    Next
    'codice
End Sub

 passo al .net...
Nessuno dei due "manda in pallone il PC"; fanno esattamente quello che
dicono di fare: interrompono completamente l'elaborazione del thread a
cui si riferiscono.
Questo vuol dire che il sistema operativo non concede nessuna % di CPU
al programma, e quindi gli impedisce di fare tutto, incluso per
esempio tutta la coda di messaggi per ridisegno dell'interfaccia
grafica; questo, al 99%, � quello che sospetto tu abbia etichettato
come "impallare il PC", e che � invece del tutto normale, e a cui si
rimedia banalmente.
Come ti hanno detto, dal tuo esempio pare che tu voglia fare semplice
pausa, e non aprire un nuovo thread, quindi, anche in VB6, �
sufficente Sleep.
Se la tua pausa � relativamente lunga, e vuoi evitare che il programma
sembri bloccato, non devi fare altro che spezzarla in pause pi� brevi,


 
un buon inizio potrebbe essere spiegare cosa devi fare...
nel post iniziale, chiedi come applicare una soluzione che tu pensi possa 
andare bene per te, ma non hai descritto cosa vuoi ottenere.
il programma cosa fa?
ha una interfaccia o viene eseguito da console/batch/servizio?
ti serve una pausa durante l'esecuzione?
oppure deve partire un'operazione mentre l'interfaccia resta in attesa?
cosa deve succedere durante la pausa?


 sleep...
Non riesco sinceramente a capire come possa addirittura compromettere
l'esecuzione di *altri* programmi... ho creato un piccolo test in VB6,
una form con due pulsanti, ecco l'intero codice:
Option Explicit
Private Declare Sub Sleep Lib "kernel32" _
    (ByVal dwMilliseconds As Long)
Dim flagStop As Boolean
Private Sub cmdStart_Click()
    Dim i As Long
    flagStop = False
    cmdStart.Enabled = False
    Do Until flagStop
        Sleep 200
        Me.Caption = Now
        DoEvents
    Loop
End Sub
Private Sub cmdStop_Click()
    flagStop = True
    cmdStart.Enabled = True
End Sub
L'ho compilato in codice nativo e sta girando da una mezz'oretta su un
notebook non particolarmente recente, diciamo fascia media...
la CPU per il test.exe tende allo 0%, ho aperti Vb6, Visual Studio
2008, Firefox e ho appena lanciato lo ZIP di un file da 500 MB
L'unico programma leggermente meno responsivo è ovviamente proprio
Test.exe per via della pausa di 200 ms interna al ciclo, ma appunto
questo è normale ed è l'unico compromesso per non mandare la CPU a
palla con l'uso indiscriminato di DoEvents, come già detto.. peraltro,
anche dimezzando la pausa la percentuale di CPU si sposta quasi di
niente, e la risponde ovviamente meglio.

 ha scritto nel messaggio 
news:Xns9C96570774995sp...@193.43.96.1...


 msgbox o di una qualsiasi form in modalit� dialogo mi riesce difficile


Option Explicit

Private Sub cmdStart_Click()

End Sub
Private Sub cmdStop_Click()

End Sub

L'unico programma leggermente meno responsivo � ovviamente proprio
Test.exe per via della pausa di 200 ms interna al ciclo, ma appunto
questo � normale ed � l'unico compromesso per non mandare la CPU a
palla con l'uso indiscriminato di DoEvents, come gi� detto.. peraltro,
anche dimezzando la pausa la percentuale di CPU si sposta quasi di
niente, e la risponde ovviamente meglio.
l'ho gia provata e testata per qualche giorno questa soluzione ma, sebbene 
inizialmente sembava dare buoni risultati, nel mio caso (vedi l'altro post) 
rallenta notevolmente il download della pagina web e rallentando 
notevolmente l'esecuzione del codice.

 
da come descrivi la tua situazione, imho il problema dipende dal fatto 
che non hai da nessuna parte operazioni realmente asincrone.
hai una sola funzione, non hai thread, non gestisci eventi.
per forza quando metti uno sleep si blocca tutto!
senza contare che se le operazioni di cui resti in attesa sono download 
via web, avrai risultati completamente diversi cambiando macchina su cui 
gira il programma e connessione a internet (ovvero il tuo sleep in un 
caso e' esagerato e nell'altro non basta).
gestisci gli eventi, imho ti conviene, soprattutto perche' dici di avere 
operazioni complesse.
come stanno le cose adesso, le tue operazioni complesse vengono eseguite 
sempre quando finisce lo sleep, che non scade necessariamente a 
operazione completata.
piu' complicate sono le operazioni, piu' vantaggi hai a gestire gli 
eventi.
