Newsgroup: it.comp.lang.visual-basic
Titolo: quesito carino: "processi paralleli"

sentite che bel quesito:
immaginiamo di avere una form con 2 tasti. All'evento click di ogni tasto
associo un codice lunghetto, che impiega parecchio a finire.
nel codice metto un bel DoEvent in modo da permetteree l'esecuzione di
ENTRAMBE le procedure associate all'evento _click
ora "Via!" e clicco sui 2 tasti
al primo click parte la prima procedura, al primo doevent incontrato parte
anche la seconda.
-  MA -  la seconda ora continua FINO ALLA FINE, perchè non ho alcun evento
che mi permetta di "continuare" la prima. E la prima aspeeeeettaaaa,
aspeeettttttaaaaaa.....
Insomma, la prima "gentile" che lascia spazio alla seconda, se la prende nel
****, perchè la seconda invece non viene interrotta da niente.
Vorrei portare avanti "entrambe" le procedure.... sapete come fare???



Hai provato a "seminare" DoEvents in entrambe le procedure? 
Ciao,
Moreno
#sirri#@#morenosoft#.com
(togliete "#" dall'indirizzo)
Moreno Sirri VB Site - 
http://www.morenosoft.com/MSVBSite/
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------------------------------------

 ---------------------------------------------------------------------------
Non serve comunque. Ho fatto un programmino con due procedure che riempiono due
liste, ma l'esecuzione di una procedura viene interrotta dall'esecuzione del'altra,
e fino a che questa non termina la prima non continua.
Bye by Massimo 8-]

Hai provato a "seminare" DoEvents in entrambe le procedure? 
Probabilmente la seconda procedura non contiene loop in cui inserire i
doevents... almeno cosě sembrerebbe dal messaggio... Puň capitare ad
esempio quando attivi la coipia di un grosso file in una singola
istruzione... č un problema che ho anch'io e non ho trovato un modo
per risolverlo... ho provato con dei timer ma l'evento non si scatena!
:-(
Moreno impara a quotare correttamente il testo...
Ciao
Remove CUTME from E-Mail address to reply!
Visit Hardware Tips: 
http://www.hardwaretips.com

La butto li.
Premetto che non ho mai usato questo metodo ne tantomento l'api.
Se chiami createthread e dai come indirizzo base del nuovo thread la
funzione (obbligatoriamente messa in un modulo o forse anche una classe)
dovrebbe andare o no?
Ciriciao gente!

>Moreno impara a quotare correttamente il testo...
Come, cosě?!?!? ;-))
Grrrrrr.....


allora,
1) i doevent sono sparsi dappertutto. Il problema è che una volta partire le
funzioni, NON ho eventi.
2) le due funzioni sono "interrompibili", in quanto non sono una singola
operazione (copia di file) ma fanno molte cose. Come detto prima, non ho
eventi che mi "spostino" da una funzione all'altra.
insomma, la risposta è "no" a tutto. Inoltre un evento farebbe "partire" la
funzione dall'inizio. io devo continuarle.
 non conosco createthread, la proverò.
Felice di ricevere altre idee....
"... e pensare che il mio nonno ha un bell'orticello..."

 Vorrei portare avanti "entrambe" le procedure.... sapete come fare???
Non conosco il tuo prog, ma non puoi creare 2 exe diversi ?
Se puoi lavorare su più thread, non stai lavorando sugli stessi dati,
quindi dovresti poterlo fare da due prog separati.
Just my € 0.017
Bye, G.
--
---------------------------------------------
    Le risposte alle tue domande le trovi
    sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
       ... e nell'help in linea !
---------------------------------------------
Real E-address: 
gaet...@hotmail.com

Premettendo che non ho mai avuto simpatia per la doevents e che quindi cerco
il piu' possibile di non usarle credo che la risposta al tuo quesito sia:
No
argomentiamo la risposta:
quando chiami la doEvents chiedi a VB di gestire un evento che si trova
nella coda dei messaggi e di passarlo all'handler dell'evento. Fino a che il
codice che gestisce questo nuovo messaggio non rientra, non è possibile
continuare l'esecuzione del codice che ha chiamato la doevents e questo fa
si che tu veda la prima procedura bloccata fino a che la seconda non
termina.
mettere dei doevents nella seconda non risolverebbe il problema, proprio
perchè doevents nella seconda procedura non permetterebbe all'handler del
primo evento di continuare l'esecuzione, ma bensi' andrebbe a prelevare un
nuovo messaggio dalla coda dei messaggi e cosi' via....
Ovviamente sono pronto a ricredermi del contrario...
Ciao

Impossibile, dovresti usare un secondo thread, in Vb non ci si riesce. Avvia
piuttosto un'altra istanza del programma


 Just my € 0.017
:):)
in $$ quanto fa? quanto fa? quanto fa? quanto fa? quanto fa? quanto fa?
quanto fa?
(cerco di stare al passo coi tempi...)

 Vorrei portare avanti "entrambe" le procedure.... sapete come fare???
come ti hanno detto, forse ricorrendo all'api.
nel frm qui sotto, se clicchi i due tasti in rapida successione, la sub
cominciata prima si interrompe e aspetta che la seconda abbia finito.
ciao, a.
Option Explicit
Private Sub Command1_Click()
    Dim j As Integer
    Command1.Enabled = False
    For j = 1 To 10000
        Label1 = j
        DoEvents
    Next
    Command1.Enabled = True
End Sub
Private Sub Command2_Click()
    Dim j As Integer
    Command2.Enabled = False
    For j = 1 To 10000
        Label2 = j
        DoEvents
    Next
    Command2.Enabled = True
End Sub

 piuttosto un'altra istanza del programma
Veramente ho parecchi programmi scritti con VB6 che utilizzano
tranquillamente, e senza problemi,  piu' thread.
Funzionano tutti sia da IDE che compilati, siano Exe, ActiveX Exe o Dll.
Pero' li sviluppo (ed utilizzo) solo sotto Win2000, e potrebbe anche
dipendere da questo.
Ciao.

Io con VB5&Win98 ottengo solo schermi blu


Vorrei portare avanti "entrambe" le procedure.... sapete come fare???
Io avevo tempo fa un esempio, credo in VB5, che si chiamava Multithread, e
dava una soluzione:
una form conteneva 2 pulsanti e 2 label per visualizzare il conteggio.
Su un modulo vi erano 2 funzioni differenti che contavano aggiornando il
label.
La chiamata veniva fatta con la funzione AdressOf passandogli la funzione
come parametro (č obbligatorio che la funzione sia in un modulo). Mi pareva
funzionasse bene, ma non ho piů il codice sottomano.
Leonardo

 Vorrei portare avanti "entrambe" le procedure.... sapete
come fare???
Una decina di giorni fa ho postato un esempio di ciclo FOR ..
NEXT che poteva essere interrotto dal tasto Annulla. Ora l'ho
(frettolosamente) modificato per gestire due cicli. Credo che
possa essere, con buona approssimazione, una risposta al tuo
quesito.
Label0(1)
Label0(2)
Label1
Label2
Command1(1)
Command2(1)
Command1(2)
Command2(2)
Timer1
Timer2
Option Explicit
Const conm_intFSAIdle As Integer = 0
Const conm_intFSABusy As Integer = 1
Const conm_intFSAEvOnLoad As Integer = 0
Const conm_intFSAEvTimer  As Integer = 1
Const conm_intFSAEvStart  As Integer = 2
Const conm_intFSAEvEnd    As Integer = 3
Const conm_intFSAEvCancel As Integer = 4
' Programma1
' -------------------------------------------
' For sta_lngIndex = con_lngFrom To con_lngTo
'   ...
' Next
' -------------------------------------------
Private Function intPgm1( _
  ByVal intEvent As Integer _
)
Const con_lngFrom   As Long = 0
Const con_lngTo     As Long = 100
Static sta_lngIndex As Long
  Select Case intEvent
  Case conm_intFSAEvTimer
    If sta_lngIndex > con_lngTo Then
      Call FSA1(conm_intFSAEvEnd)
      Let intPgm1 = conm_intFSAIdle
    Else
      With Label1
        Let .Caption = sta_lngIndex
        Call .Refresh
      End With
      Let sta_lngIndex = sta_lngIndex + 1
      Let intPgm1 = conm_intFSABusy
    End If
  Case conm_intFSAEvStart
    Let sta_lngIndex = con_lngFrom
    Let Command1(1).Enabled = False
    Let Command2(1).Enabled = True
    With Timer1
      Let .Interval = 1
      Let .Enabled = True
    End With
    Let intPgm1 = conm_intFSABusy
  Case conm_intFSAEvCancel, conm_intFSAEvEnd
    Let Timer1.Enabled = False
    Let Command2(1).Enabled = False
    Let Command1(1).Enabled = True
    Let intPgm1 = conm_intFSAIdle
  Case Else
    Call MsgBox("Errore.", vbCritical + vbOKOnly, "PGM1")
  End Select
End Function
' Programma2
' -------------------------------------------
' For sta_lngIndex = con_lngFrom To con_lngTo
'   ...
' Next
' -------------------------------------------
Private Function intPgm2( _
  ByVal intEvent As Integer _
)
Const con_lngFrom   As Long = 0
Const con_lngTo     As Long = 50
Static sta_lngIndex As Long
  Select Case intEvent
  Case conm_intFSAEvTimer
    If sta_lngIndex > con_lngTo Then
      Call FSA2(conm_intFSAEvEnd)
      Let intPgm2 = conm_intFSAIdle
    Else
      With Label2
        Let .Caption = sta_lngIndex
        Call .Refresh
      End With
      Let sta_lngIndex = sta_lngIndex + 1
      Let intPgm2 = conm_intFSABusy
    End If
  Case conm_intFSAEvStart
    Let sta_lngIndex = con_lngFrom
    Let Command1(2).Enabled = False
    Let Command2(2).Enabled = True
    With Timer2
      Let .Interval = 1
      Let .Enabled = True
    End With
    Let intPgm2 = conm_intFSABusy
  Case conm_intFSAEvCancel, conm_intFSAEvEnd
    Let Timer2.Enabled = False
    Let Command2(2).Enabled = False
    Let Command1(2).Enabled = True
    Let intPgm2 = conm_intFSAIdle
  Case Else
    Call MsgBox("Errore.", vbCritical + vbOKOnly, "PGM2")
  End Select
End Function
Private Sub FSA1( _
  ByVal intEvent As Integer _
)
Static sta_intFSA As Integer
  Select Case sta_intFSA
  Case conm_intFSAIdle
    Select Case intEvent
    Case conm_intFSAEvOnLoad
      'Call Init
    Case conm_intFSAEvStart
      Let sta_intFSA = intPgm1(intEvent)
    Case Else
      Call MsgBox("Errore.", vbCritical + vbOKOnly, "FSA1")
    End Select
  Case conm_intFSABusy
    Let sta_intFSA = intPgm1(intEvent)
  Case Else
    Call MsgBox("Errore.", vbCritical + vbOKOnly, "FSA1")
  End Select
End Sub
Private Sub FSA2( _
  ByVal intEvent As Integer _
)
Static sta_intFSA As Integer
  Select Case sta_intFSA
  Case conm_intFSAIdle
    Select Case intEvent
    Case conm_intFSAEvOnLoad
      'Call Init
    Case conm_intFSAEvStart
      Let sta_intFSA = intPgm2(intEvent)
    Case Else
      Call MsgBox("Errore.", vbCritical + vbOKOnly, "FSA2")
    End Select
  Case conm_intFSABusy
    Let sta_intFSA = intPgm2(intEvent)
  Case Else
    Call MsgBox("Errore.", vbCritical + vbOKOnly, "FSA2")
  End Select
End Sub
Private Sub Command1_Click(Index As Integer)
  Select Case Index
  Case 1: Call FSA1(conm_intFSAEvStart)
  Case 2: Call FSA2(conm_intFSAEvStart)
  End Select
End Sub
Private Sub Command2_Click(Index As Integer)
  Select Case Index
  Case 1: Call FSA1(conm_intFSAEvCancel)
  Case 2: Call FSA2(conm_intFSAEvCancel)
  End Select
End Sub
Private Sub Form_Load( _
)
  Let Timer1.Enabled = False
  Let Timer2.Enabled = False
  With Label1
    Let .AutoSize = True
    Let .Caption = ""
  End With
  With Label2
    Let .AutoSize = True
    Let .Caption = ""
  End With
  With Label0(1)
    Let .AutoSize = True
    Let .Caption = ""
  End With
  With Label0(2)
    Let .AutoSize = True
    Let .Caption = ""
  End With
  With Command1(1)
    Let .Caption = "Avvia1"
    Let .Enabled = True
  End With
  With Command2(1)
    Let .Caption = "Annulla1"
    Let .Enabled = False
  End With
  With Command1(2)
    Let .Caption = "Avvia2"
    Let .Enabled = True
  End With
  With Command2(2)
    Let .Caption = "Annulla2"
    Let .Enabled = False
  End With
  Call FSA1(conm_intFSAEvOnLoad)
  Call FSA2(conm_intFSAEvOnLoad)
End Sub
Private Sub Timer1_Timer( _
)
  ' Dimostra l'attivita` di Timer1.
  '
  With Label0(1)
    Let .Caption = Format$(Now)
    Call .Refresh
  End With
  Call FSA1(conm_intFSAEvTimer)
End Sub
Private Sub Timer2_Timer( _
)
  ' Dimostra l'attivita` di Timer2.
  '
  With Label0(2)
    Let .Caption = Format$(Now)
    Call .Refresh
  End With
  Call FSA2(conm_intFSAEvTimer)
End Sub
--
Ciao.
Maurizio

Trovi un esemprio sull'api guide (scaricabile su 
www.allapi.net
)

MANDAMELO! voglio vedere un multithreading VB funzionante!!!



Non lo trovo piu!....
Leo