Il linguaggio Visual Basic di Microsoft
 

lock userform e controlli

sal21 12 Nov 2015 21:59
Ho un form con bottoni, listbox, combobox... ecc
con un button nell'evento click faccio partire un codice che porta via del
tempo.
durante questa pausa di elaborazione, spesso l'utente nell'attesa che il codice
abbia finito, si mette a cliccare ovunque nel form. questo crea errori!
posso bloccare l'accesso a tutti i controlli presenti nel form, fino a che il
codice nel button abbia finito?
Se si, come faccio via codice?

ho immaginato ad una progressbar "circular", tipo rotellina, che si pone "in
front" al form, bloccando ogni azione form, come spesso avviene su internet con
vari siti...
sal21 12 Nov 2015 22:05
Il giorno giovedì 12 novembre 2015 21:59:45 UTC+1, sal21 ha scritto:
> Ho un form con bottoni, listbox, combobox... ecc
> con un button nell'evento click faccio partire un codice che porta via del
tempo.
> durante questa pausa di elaborazione, spesso l'utente nell'attesa che il
codice abbia finito, si mette a cliccare ovunque nel form. questo crea errori!
> posso bloccare l'accesso a tutti i controlli presenti nel form, fino a che il
codice nel button abbia finito?
> Se si, come faccio via codice?
>
> ho immaginato ad una progressbar "circular", tipo rotellina, che si pone "in
front" al form, bloccando ogni azione form, come spesso avviene su internet con
vari siti...

dienticavo uso VB6
salclem2 13 Nov 2015 07:20
"sal21" <gss.italy@iol.it> nel suo ultimo post si è così espresso:
> Ho un form con bottoni, listbox, combobox... ecc
> con un button nell'evento click faccio partire un codice che porta via del
tempo.
> durante questa pausa di elaborazione, spesso l'utente nell'attesa che il
codice abbia finito, si mette a cliccare
> ovunque nel form. questo crea errori!
> posso bloccare l'accesso a tutti i controlli presenti nel form, fino a che il
codice nel button abbia finito?
> Se si, come faccio via codice?
>
> ho immaginato ad una progressbar "circular", tipo rotellina, che si pone "in
front" al form, bloccando ogni azione
>>form, come spesso avviene su internet con vari siti...

Basta usare un flag public impostato a true finché l'elaborazione è in corso
in modo che a ogni evento estraneo ci sia
un'uscita immediata con relativo avviso all'utente, quando hai finito imposta il
flag a false.
Oppure apri un form popup che fa tutt'e due le cose (blocca e avvisa) fino alla
fine dell'elaborazione







--
http://freewarewiki.it
http://freewareonline.org
http://netuser.altervista.org
Luca D 13 Nov 2015 09:24
Il giorno giovedì 12 novembre 2015 21:59:45 UTC+1, sal21 ha scritto:
> Ho un form con bottoni, listbox, combobox... ecc
> con un button nell'evento click faccio partire un codice che porta via del
tempo.
> durante questa pausa di elaborazione, spesso l'utente nell'attesa che il
codice abbia finito, si mette a cliccare ovunque nel form. questo crea errori!
> posso bloccare l'accesso a tutti i controlli presenti nel form, fino a che il
codice nel button abbia finito?
> Se si, come faccio via codice?

Il sistema più rapido, senza usare una seconda finestra modal che potrebbe dare
fasti***** al tuo flusso di eventi (se la apri modeless non risolve), è
semplicemente disabilitare l'intera form con Me.Enabled=false.

Poi vedi tu come dare feedback all'utente: barra di avanzamento, pannello in
primo piano con animazione ecc...
salclem2 13 Nov 2015 13:50
"Luca D" <antaniserse@yahoo.it> nel suo ultimo post si è così espresso:
>Il giorno giovedì 12 novembre 2015 21:59:45 UTC+1, sal21 ha scritto:
>> Ho un form con bottoni, listbox, combobox... ecc
>> con un button nell'evento click faccio partire un codice che porta via del
tempo.
>> durante questa pausa di elaborazione, spesso l'utente nell'attesa che il
codice abbia finito, si mette a cliccare
>> ovunque nel form. questo crea errori!
>> posso bloccare l'accesso a tutti i controlli presenti nel form, fino a che il
codice nel button abbia finito?
>> Se si, come faccio via codice?
>
>Il sistema più rapido, senza usare una seconda finestra modal che potrebbe
dare fasti***** al tuo flusso di eventi (se la
>apri modeless non risolve), è semplicemente disabilitare l'intera form con
Me.Enabled=false.
>
>Poi vedi tu come dare feedback all'utente: barra di avanzamento, pannello in
primo piano con animazione ecc...
>
Disabilitare l'intera form principale mi sembra un po' drastica come soluzione,
ad es. non la puoi neanche ridurre a
icona.
Volendo basta mettere un loop subito dopo l'apertura del form popup, basato su
una proprietà settata a true nell'evento
Load e a false nell'evento Unload del form,
tipo questo:
Form1.Show
Do While Form1.Loaded
DoEvents
Loop





--
http://freewarewiki.it
http://freewareonline.org
http://netuser.altervista.org
Luca D 13 Nov 2015 15:41
Il giorno venerdì 13 novembre 2015 13:51:01 UTC+1, salclem2 ha scritto:

> Disabilitare l'intera form principale mi sembra un po' drastica come
soluzione, ad es. non la puoi neanche ridurre a
> icona.

Si, ma dai per scontato che sia una finestra riducibile a icona (magari è una
Fixed Dialog) e/o che la cosa gli interessi specificamente

> Volendo basta mettere un loop subito dopo l'apertura del form popup, basato su
una proprietà settata a true nell'evento
> Load e a false nell'evento Unload del form,
> tipo questo:
> Form1.Show
> Do While Form1.Loaded
> DoEvents
> Loop
>

Questo è pure peggio:
a) Quel loop consuma un sacco di CPU a fare niente
b) A meno che l'elaborazione che deve fare non sta on un componente COM separato
per sfruttare il multithreading, dubito riesca ad eseguire *contemporaneamente*
il ciclo di lavoro vero e proprio e questo ciclo di attesa
salclem2 13 Nov 2015 16:56
"Luca D" <antaniserse@yahoo.it> wrote in message
news:9b7c29ae-bfb8-44b4-b056-b6138b0fd478@googlegroups.com...
>Il giorno venerdì 13 novembre 2015 13:51:01 UTC+1, salclem2 ha scritto:
>
>> Disabilitare l'intera form principale mi sembra un po' drastica come
soluzione, ad es. non la puoi neanche ridurre a
>> icona.
>
>Si, ma dai per scontato che sia una finestra riducibile a icona (magari è una
Fixed Dialog) e/o che la cosa gli
>interessi specificamente
>
>> Volendo basta mettere un loop subito dopo l'apertura del form popup, basato
su una proprietà settata a true
>> nell'evento
>> Load e a false nell'evento Unload del form,
>> tipo questo:
>> Form1.Show
>> Do While Form1.Loaded
>> DoEvents
>> Loop
>>
>
>Questo è pure peggio:
>a) Quel loop consuma un sacco di CPU a fare niente
>b) A meno che l'elaborazione che deve fare non sta on un componente COM
separato per sfruttare il multithreading,
>dubito riesca ad eseguire >*contemporaneamente* il ciclo di lavoro vero e
proprio e questo ciclo di attesa

Quello che dici mi sembra un po' azzardato, non ci credo. Anche perché il
DoEvents non fa altro che attaccarsi alla
normale coda degli eventi di Windows che restano comunque sempre attivi, e
quindi al massimo consumerebbe la stessa CPU
che userebbe senza loop





--
http://freewarewiki.it
http://freewareonline.org
http://netuser.altervista.org
Luca D 13 Nov 2015 20:37
Il giorno venerdì 13 novembre 2015 17:56:26 UTC+1, salclem2 ha scritto:

> Quello che dici mi sembra un po' azzardato, non ci credo.

Non avevo dubbi...
Stai impostando un loop potenzialmente infinito, visto che è sempre attivo
fintanto che la seconda finestra è aperta, chi credi che si occupi di eseguire
quelle istruzioni, per quanto semplici, n-mila volte al secondo, se non la tua
cara, vecchia CPU?! sono proprio le basi, eh...

Siccome le chiachiere stanno a zero, crea un semplice progetto con due form, con
il comportamento che hai suggerito; il codice di Form1 è:

Private Sub Command1_Click()
Form2.Show
End Sub

Private Sub Command2_Click()
Form2.Show
Do While Form2.Loaded
DoEvents
Loop
End Sub

Il codice di Form2 è

Public Loaded As Boolean

Private Sub Form_Load()
Loaded = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
Loaded = False
End Sub

Compila, apri task manager e guarda la differenza quando premi il primo
pulsante, che apre semplicemente la finestra, e il secondo che fa il ciclo di
controllo "a manetta" coi DoEvents

Vedi tu...
salclem2 14 Nov 2015 11:19
"Luca D" <antaniserse@yahoo.it> nel suo ultimo post si è così espresso:
>Il giorno venerdì 13 novembre 2015 17:56:26 UTC+1, salclem2 ha scritto:
>
>> Quello che dici mi sembra un po' azzardato, non ci credo.
>
>Non avevo dubbi...
>Stai impostando un loop potenzialmente infinito, visto che è sempre attivo
fintanto che la seconda finestra è aperta,
>>chi credi che si occupi di eseguire quelle istruzioni, per quanto semplici,
n-mila volte al secondo, se non la tua
>cara, >vecchia CPU?! sono proprio le basi, eh...
Pardon, hai ragione.
Allora io lo farei con un flag public, come detto in precedenza, o con un form
modale








--
http://freewarewiki.it
http://freewareonline.org
http://netuser.altervista.org
SB 16 Nov 2015 10:41
Il giorno Fri, 13 Nov 2015 16:56:21 +0100, "salclem2" <salclem2@yahoo.it> ha
scritto:

>>Questo è pure peggio:
>>a) Quel loop consuma un sacco di CPU a fare niente
>>b) A meno che l'elaborazione che deve fare non sta on un componente COM
separato per sfruttare il multithreading,
>>dubito riesca ad eseguire >*contemporaneamente* il ciclo di lavoro vero e
proprio e questo ciclo di attesa
>
>Quello che dici mi sembra un po' azzardato, non ci credo. Anche perché il
DoEvents non fa altro che attaccarsi alla
>normale coda degli eventi di Windows che restano comunque sempre attivi, e
quindi al massimo consumerebbe la stessa CPU
>che userebbe senza loop

Il loop fatto così mette la cpu al 100% (o almeno il core dedicato al thread
con
Vb)

Per ridurre il consumo di CPU ti basta mettere una chiamata all' Api Sleep nel
loop

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Form1.Show
Do While Form1.Loaded
Sleep 1
DoEvents
Loop

anche con un solo millisecondo verai che il consumo di cpu passa dal 100% a
quasi zero, e potresti anche eliminare il DoEvents() perchè l'api Sleep
restituisce al so la gestione.

Il loop non è la soluzione che userei per il quesito proposto, era solo per
suggerire come fare dei loop, un esempio classico e' la *****e in polling,
senza mai mandare la cpu al 100%.


--
ciao
Stefano

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio Visual Basic di Microsoft | Tutti i gruppi | it.comp.lang.visual-basic | Notizie e discussioni visual basic | Visual basic Mobile | Servizio di consultazione news.