Newsgroup: it.comp.lang.visual-basic
Titolo: Sospendere esecuzione di una Sub

Dunque vorrei ad un certo punto mandare in pausa una funzione (FUNZIONE1)
finchè non ho finito in una DataArrival (FUNZIONE2) di winsock di ricevere
dati.
Allora ho pensato di mettere un flag in FUNZIONE1 e ciclare con vari
doevents finchè il flag diventa false, ma mi blocca tutto il programma (e la
CPU va al 100%) mentre io vorrei continuare a ricevere dati sulla FUNZIONE2.
Come dovrei fare?
bye
-- 
Gestione Ottica - Gestionale per Ottici e Programmi Gratuiti su:
http://www.nicolaottomano.it
Sinapsi Antispam. Antispam Gratuito.
http://www.sinapsi-antispam.tk
http://www.nicolaottomano.it/sinapsi.htm
Ingrosso Orologi.
http://www.supertop.it
email spamtrap: 
spam...@nicolaottomano.it

 Come dovrei fare?
la prima cosa che mi viene in mente è mettere uno sleep all'interno del
ciclo in cui chiami il doevents, ma magari ci hai già provato...
-- 
Salutoni
Sergio
Per rispondere... togli il group dall'indirizzo
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 del ciclo in cui chiami il doevents, ma magari ci hai già provato...
il problema è che lo sleep blocca tutta l'esecuzione del programma.
Non capisco perchè sia Sleep che DoEvents bloccano tutto.
Ci vorrebbe il multithread ma non ho idea di come gestirlo...


 il problema č che lo sleep blocca tutta l'esecuzione del programma.
ho appena riguardato un mio programma in cui aspetto il navigate complete
di un webbrowser, e il codice č proprio
do until arrivato
   doevents 
   sleep 200
loop
arrivato č un boolean a livello di modulo che diventa vero quando si
verifica il navigate complete.
di piů nin zň


"Ottomano Nicola" <amiciT...@nicolaTOGLIQUESTOottomano.it> ha scritto nel messaggio
news:MpGSd.60686$2h5....@tornado.fastwebnet.it...

dovresti mandare un po' di codice (la parte in cui usi doevents)
 per vedere dove sbagli

 verifica il navigate complete.
Mai provato, ma mi sembra di ricordare MSDN che diceva
Do While WebBrowser1.Complete ' o come cavolo si chiama
    DoEvents
loop
Ciao 

 ha scritto nel messaggio news:3812jkF...@individual.net...

sono d'accordo con Zanna

 ha scritto nel messaggio
news:3812jkF...@individual.net

il mio problema è che uso winsock e che la comunicazione avviene con Outlook
da una parte e un server pop3 dall'altra...


Ciao 
Però, se non ricordo male, la cosa funziona a patto che il componente
che stai utilizzando usi multithreading di suo (perché, sempre a
memoria, col DoEvents passi il controllo a sistema operativo... anzi,
aspetta che guardo.... In effetti "DoEvents Yelds execution so that
the operating system can process other events").
Il che vuol dire che si possono adottare due soluzioni:
1) si simula il multithreading utilizzando un timer. Non è bellissimo,
ma funziona.
2) crei un componente out of process, avendo cura di progettare
adeguatamente la sincronizzazione.
Potrei dire 3) passo a .net, che gestisce il multithreading in modo
nativo, ma non so se è il caso... :))))
--
Ciao!
Luca Menegotto


mmm... mi crescono due soggetti: webbrowser dove sta?
Se c'è Outlook da una parte e il pop3 dall'altra il winsock che ruolo ha?
Ciao 

 ha?
Fa parte di Sinapsi Antispam... :)


Fa parte di Sinapsi Antispam... :)
A proposito, l'interfaccia è molto carina. L'hai disegnata tu?
--
Ciao!
Luca Menegotto

 Ci vorrebbe il multithread ma non ho idea di come gestirlo...
Sì, hai detto bene, in teoria ci vuole un thread secondario.
Mi sembra che il controllo Winsock sia già di per sé multithreaded, proprio per
poter essere usato da VB senza preoccuparsi più di tanto.
Se il tuo cruccio è solo che mentre il programma esegue il loop di "attesa
evento" la CPU va al 100%, questo è un "falso" problema.
Se metti uno "Sleep 1" nel loop l'indicatore della CPU dovrebbe scendere.
Oppure effettivamente quando il programma è nel loop l'evento DataArrival non si
innesca?
Bye
Raf

 A proposito, l'interfaccia è molto carina. L'hai disegnata tu?
Si, ma sono stato affiancato dalla mia ragazza.


 l'evento DataArrival non si innesca?
in realtà non avevo pensato all'accoppiata sleep+doevents, ma a sleep oppure
a doevents.
In effetti così la cpu non va al 100%, ma sto vedendo come va  nello
scaricamento di grossi files (dove bisogna tenere bloccata la routine per un
bel pò)


Io stavo facendo un progetto con Winsock tempo fa, e ricordo che nel 
data_arrival mettevo in una variabile stringa tutto ciň che ricevevo 
(vabč ricevevo del testo, ma per i dati binari si puň usare un array di 
bytes) e nel data_arrival stesso controllavo se era finita la 
trasmissione oppure no. Quando la trasmissione terminava, settavo a True 
una variabile di modulo, e quindi la funzione che "comandava" il winsock 
di iniziare questra trasmissione con il pc remoto faceva grosso modo cosě:
Private Function Funzione() As ...
     ...
     FineTrasmissione = False
     'Chiedo al PC remoto di iniziare la trasmissione
     MySock.SendData "..."
     Do While Not FineTrasmissione
         DoEvents
     Loop
     ...
End Function
-- 
Quando noi ignoranti eravamo di piů, tutto era piů bello...
(A. Celentano)
Per rispondermi in privato, prima togli l'immondizia dalla testa.

 
http://www.nicolaottomano.it/sinapsi.htm
Dopo aver letto il post ho visto i link e ho capito che il problema ce l'hai
nel tuo filtro antispam, l'ho capito perchè è lo stesso che ho avuto io
nella realizzazione del mio (con la differenza che io sono venale e pertanto
lo vendo).
In tutti i modi io ho risolto con i due flag che vedi sotto nel pezzetto di
codice che ti riporto chiamati ReadyToRetrieve e RetrieveInProgress che
opportunamente combinati e settati ti danno modo di tenere sotto controllo
sia l'outlook da una parte che il pop dall'altra senza far impazzire la cpu
e mettere seduto il computer.
P.S. Per i file di grosse dimensioni a meno che non intendi mandare (e sai
come fare, io no) un ACK all'outlook per evitare che vada in timeout ti
conviene portare il timeout della casella a 5 minuti il massimo disponibile.
Ciao a presto
Stephen
Sub WSKP_DataArrival(ByVal bytesTotal As Long)
    On Error GoTo WSKP_DataArrival_Error
    Dim Chestaffa As String
    Dim HeaderPosition As Long
    Dim strData As String
    ' --- Recupera i dati ricevuti dal POP
    Chestaffa = "WSKP_DataArrival = WSKP.GetData strData"
    WSKP.GetData strData
    ' --- Se predisposto alla ricezione del messaggio:
    ' --- svuota la stringa di ricezione
    ' --- si dispone in attesa dell'arrivo della sequenza di fine messaggio
    If ReadyToRetrieve = True Then
        DatiRicevuti = ""
        ReadyToRetrieve = False
        RetrieveInProgress = True
    End If
    ' --- Bufferizza in una variabile stringa
    DatiRicevuti = DatiRicevuti & strData
    ' --- Si dispone in attesa dell'arrivo della sequenza (vbcrlf . vbcrlf)
    If RetrieveInProgress = True _
    And InStrRev(DatiRicevuti, vbCrLf & "." & vbCrLf) <> 0 Then
    ecc.ecc.ecc.

 dall'altra senza far impazzire la cpu e mettere seduto il computer.
Grazie mille gli darò un'occhiata per vedere se riesco a risolvere questo
problema (al quale ho messo una "pezza" ma che non posso lasciare così).
bye
-- 
Gestione Ottica - Gestionale per Ottici e Programmi Gratuiti su:
http://www.nicolaottomano.it
Sinapsi Antispam. Antispam Gratuito.
http://www.sinapsi-antispam.tk
http://www.nicolaottomano.it/sinapsi.htm
Ingrosso Orologi.


 Do While WebBrowser1.Complete 
ti riferisci a webbrowser.busy ?
ci ho provato. per la navigazione che faccio non funziona, non rileva
esattamente il momento in cui il documento è completamente scaricato. ho
dovuto guardare l'evento documentcomplete, verificando che si riferisca
all'oggetto e non ad un suo frame, per venirne fuori.


 Come dovrei fare?
Potresti usare le Wait functions:
Private Const WAIT_TIMEOUT As Long = 258&
Private Const WAIT_FAILED As Long = &HFFFFFFFF
Private Const INFINITE = -1& ' Infinite interval
Private Const WAIT_OBJECT_0 = 0
Dim DataArrivalEvent As Long
Private Sub FUNZIONE1()
   Dim RetVal As Long
   'Creo l'evento
   DataArrivalEvent = CreateEvent(SecAttr, True, False, vbNullString)
   If IsNull(DataArrivalEvent ) Then debug.print "ERRORE: " & GetLastError
   'Aspetto all'infinito
   RetVal = MsgWaitObj(INFINITE, DataArrivalEvent , 1&)
   ResetEvent DataArrivalEvent
   Select Case RetVal
     Case WAIT_TIMEOUT
       'TimeOut (In questo caso non capita mai)
     Case WAIT_FAILED
       'Ha fallito l'API
       Err.Number = GetLastError
       Err.Description = "Waiting function error."
     Case WAIT_OBJECT_0
       'La FUNCTION2 ha terminato
   End Select
End Sub
Private Sub FUNCTION2 ()
   ...
   code
   ...
   'Setto l'evento a SIGNALED
   SetEvent DataArrivalEvent
End Sub
La funzione MsgWaitObj fa uso della MsgWaitForMultipleObjects e ti permette di avere 
un'unica interfaccia per tutti i tipi di attesa.
Io la uso molto..
Prova a darci un'occhiata:
http://www.freevbcode.com/ShowCode.Asp?ID=4322
Ciao!
LeleB.