Newsgroup: it.comp.lang.visual-basic
Titolo: Priorità input tastiera

Ho sviluppato un programma che ricerca dei dati su moltissimi record (Visual 
Basic e Mysql).
Quando faccio delle ricerche capita che si blocca la tastiera.
Vorrei dare priorit� assoluta all'input da tastiera, piuttosto che ai 
processi di elaborazione dati.
Se digito sulla tastiera non si dovrebbe bloccare il processo di scrittura.
Grazie. 



Imho � sbagliato fare una select su un'interfaccia utente ad esempio al
change di una textbox.
Piuttosto prova a caricarti i record in una collection/classe, e filtrare
su quella.
Io uso sistemi simili in cui in una textbox scrivo del testo e sotto carico
una listview, e per qualche centinaio di record funziona bene.

"Andrea [Work]" <andrea.isw...@gmail.invalid> ha scritto nel 
messaggio news:1udfdh9wpctvm$.jfusnv9wvdn7$.dlg@40tude.net...

ok... Grazie per la disponibilit�.
Io uso una MSHflexgrid per visualizzare i record risultato della ricerca 
effettuata sulla textbox.
Quindi sul change della textbox parto con l'interrogazione sulla base dati.
Si parla di circa 400.000 record, tuttavia riesco ad essere abbastanza 
veloce perch� estraggo solo i record
visualizzabili in griglia (circa 20).
Volendo adottare la tua soluzione, come faccio a sapere quando l'utente ha 
smesso di scrivere?
Potresti fare qualche esempio del codice usato? 

 Potresti fare qualche esempio del codice usato?
Secondo me sbagli approccio.
Anche nei siti che ti danno i suggerimenti per le ricerche non � che
indicizzano 500mila frasi.
Io farei che quando l'utente preme invio sulla casella di testo, fai la
ricerca.
Facile da spiegare e da usare, � come fanno gi� con google. A quel punto
alla pressione del tasto enter fai la ricerca sulla stringa digitata.
La "mia" ricerca lavora in tempo reale sulle combo, ma non va certo bene
per 400mila record.
Comunque se proprio vuoi farlo al change chiami il popolamento della
griglia, gestendo che sia l'unica chiamata in corso (con una variabile
static).
Sub PopolaGriglia
  Static bRun as boolean
  if bRun then exit sub
  bRun=True
  ...
  bRun=False
End sub
Poi verifica di aver indicizzato bene.
Eviteri di usare timer, ma prova un po'. Devi resettarlo non appena premi
un tasto, e disattivarlo quando la len(textbox)=0.

 Potresti fare qualche esempio del codice usato?
Secondo me sbagli approccio.
Anche nei siti che ti danno i suggerimenti per le ricerche non � che
indicizzano 500mila frasi.
Io farei che quando l'utente preme invio sulla casella di testo, fai la
ricerca.
Facile da spiegare e da usare, � come fanno gi� con google. A quel punto
alla pressione del tasto enter fai la ricerca sulla stringa digitata.
La "mia" ricerca lavora in tempo reale sulle combo, ma non va certo bene
per 400mila record.
Comunque se proprio vuoi farlo al change chiami il popolamento della
griglia, gestendo che sia l'unica chiamata in corso (con una variabile
static).
Sub PopolaGriglia
  Static bRun as boolean
  if bRun then exit sub
  bRun=True
  ...
  bRun=False
End sub
Poi verifica di aver indicizzato i campi correttamente sul DB (non so come
lavora mySQL).
Eviteri di usare timer, ma prova un po'. Devi resettarlo non appena premi
un tasto, e disattivarlo quando la len(textbox)=0.
Comunque eviterei di lanciare automaticamente la ricerca quando la parola �
troppo corta.

"Andrea [Work]" <andrea.isw...@gmail.invalid> ha scritto nel 
messaggio news:lsnspd1ad2z0.13waqcm1pwuw9$.dlg@40tude.net...

ok... Grazie.. Ottima idea.
Per il DMBS ho creato i vari indici a seconda della ricerca.
Avevo provato con il Timer: lo abilitavo a inizio ricerca e lo disabilitavo 
a fine ricerca.
Poi per le parole corte e che non producono risultati in effetti c'� un 
rallentamento.
Adesso provo la tua soluzione.


Ho letto sia questo che il tuo precedente post.
Non so se il provider mysql la supporta, per� in teoria c'� la possibilit� 
di eseguire delle query (= riempire recordset) in modo asincrono, anche con 
VB6/ADO.
Dai un'occhiata qui: 
http://support.microsoft.com/kb/190988
Se funziona, io userei questo approccio:
- un recordset (RS), dichiarato WithEvents
- un timer (Timer1) con Interval 100 ms, sempre abilitato
- una variabile di modulo (IdleTime) che conta il tempo dall'ultima 
pressione di un tasto nella casella testo (Text1)
- nell'evento Timer1_Timer si incrementa IdleTime di 100ms; se IdleTime 
supera il limite di attesa input desiderato (es. 1 secondo), viene chiamata 
una sub in cui si effettua il riempimento asincrono del recordset
- nell'evento RS_FetchComplete si effettua il bind della grid dei risultati
- nell'evento Text1_KeyPressed si azzera IdleTime; se per� la propriet� 
State del recordset indica che il fetch � ancora in corso ((RS.State AND 
adStateFetching) <> 0), allora si dovrebbe interrompere l'operazione, 
invocando il metodo RS.Cancel
Bye
Raf 

 VB6/ADO.
Buono, questa non la sapevo.
Ho keepato il msg.