Newsgroup: it.comp.lang.visual-basic
Titolo: Cicli & ... blocco

Uffa... ancora una volta in ricerca di aiuto :
Sto scrivendo un programma client per applicazioni di rete.
Il mio problema è il seguente (ed è generalizzato anche ad altre
applicazioni) :
se faccio un cliclo di attesa il computer si blocca... mi spiego meglio
con un esempio
dim Basta as boolean
Basta = false
winsock1.connect 10.10.10.10 , 95
while Basta = false
  if winsock1.state = 7 then Basta = true
wend
Il programma sia compilato che mandato in esecuzione dirattamente da vb5
si blocca.
Come già detto ho problemi su tutti i cicli del genere.
Vi ringrazio per l'aiuto...

 Come già detto ho problemi su tutti i cicli del genere.
Prima di tutto vediamo di risolvere il problema del tuo esempio. Il tuo
ciclo serve per attendere che la connessione sia andata a buon fine, giusto?
Allora perchè non usi l'evento apposito cioè Winsock_Connect... VB non sarà
propriamente OOP, ma non è nemmeno procedurale, quindi ricordati che stai
sempre programmando ad oggetti e un loop non è quasi mai la soluzione
giusta.
Cmq parlavi che i loop sono sempre un tuo problema e, visto che a volte non
se ne può fare a meno, ricordati di inserire un 'doevents' dentro il ciclo
per far si che il S.O. gestisca gli eventi in lista. Inoltre, sempre che
questo sia compatibile con quello che devi fare, puoi anche sfruttare un
controllo Timer.
Spero di esserti stato d'aiuto
Ciao
Daniele
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------------------------------------

wend
Il programma secondo me non si blocca ma rimane in loop all'infinito (per
W95 un loop infinito è = a blocco!)
Infatti la riga 'if winsock1.state = 7 then Basta = true' che cecca la
connessione è all'interno ad un loop da sola! come puoi pretendere che si
accorga se la connessione sia andata a buon fine se non glila fai fare ogni
volta?
es.:
dim Basta as boolean
Basta = false
while Basta = false
    winsock1.connect 10.10.10.10 , 95 'ritenta la connessione!
    if winsock1.state = 7 then Basta = true
wend
Si può dire che il programma non si bloccava solo se al primo colpo la
connessione sisultava riuscita!
Spero di esserti stato utile

Come già detto ho problemi su tutti i cicli del genere.
Lo credo bene. L'uso di "cicli del genere" in sistemi multitasking
come Win32 e' una grossa str@#%@&a, perche' (semplificando):
- viene consumata stupidamente uan risorsa critica del sistema
  (la cpu)
- nel caso di sistemi non dotati di efficienti meccanismi di
  schedulazione con time-slice e gestione automatica delle
  priorita' (round-robin), si puo' avere un blocco delle
  segnalazioni degli eventi di sistema
La soluzione consiste nell'uso corretto degli eventi di sistema
(nel tuo caso l'evento Connect), o in mancanza, nell'uso di
un control Timer per effettuare il test con una frequenza
ne' troppo bassa (per non ritardare la rilevazione dell'evento)
ne' troppo alta (per non appesantire il sistema).
Alla peggio, inserisci almeno una DoEvents nel ciclo.
Louis.
-----------------------------
E' difficile fare previsioni,
soprattutto sul futuro...