Autore Topic: Bloccare mouse per un certo tempo  (Letto 1015 volte)

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Bloccare mouse per un certo tempo
« il: 15 Marzo 2013, 12:15:44 »
Come da titolo vorrei bloccare il mouse (e magari la tastiera) per la durata di un processo che sto eseguendo lasciando però che il resto della macchina continui a funzionare
è possibile?
"e il naufragar m'è dolce in questo mar"

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Bloccare mouse per un certo tempo
« Risposta #1 il: 15 Marzo 2013, 12:28:04 »
Per quale motivo? vuoi che l'utente non utilizzi l'intero pc o solamente l'applicazione?

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: Bloccare mouse per un certo tempo
« Risposta #2 il: 15 Marzo 2013, 12:35:47 »
sto utilizzando un panel PC con touch screen e vi gira una applicazione in Gambas che aziona un dispositivo meccanico
nel momento in cui parte la sequenza di movimenti che dura circa 3-4 secondi l'operatore non deve interagire con la macchina, ma il pc deve proseguire nel controllo del sistema.
Il form è full screen
Potrei disabilitare momentaneamente tutti i controlli sullo schermo, ma vorrei sapere se esiste anche qualche altra possibilità. 
"e il naufragar m'è dolce in questo mar"

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Bloccare mouse per un certo tempo
« Risposta #3 il: 15 Marzo 2013, 17:05:12 »
...forse con
Codice: gambas [Seleziona]

   Sleep  num_sec.


anche se però ho constatato che, durante lo ''Sleep'' i controlli sono, sì, ''bloccati'', ma - terminato il tempo di attesa - se si è agito nel frattempo sui Controlli, i relativi eventi si scateneranno ugualmente.... con ritardo, ma si scateneranno.
« Ultima modifica: 15 Marzo 2013, 17:25:00 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: Bloccare mouse per un certo tempo
« Risposta #4 il: 15 Marzo 2013, 17:34:52 »
forse con wait
se ne è parlato in un altra discussione
"e il naufragar m'è dolce in questo mar"

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Bloccare mouse per un certo tempo
« Risposta #5 il: 15 Marzo 2013, 17:49:56 »
forse con wait

Ho fatto la prova: Wait non ti blocca l'azione sui Controlli; e comunque ''Sleep'' dà "alla CPU il tempo di eseguire delle altre operazioni passando il controllo al sistema operativo.".
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: Bloccare mouse per un certo tempo
« Risposta #6 il: 15 Marzo 2013, 18:07:23 »
ok
sleep 1 ferma il programma per 1 secondo passando il controllo al sistema operativo
però probabilmente ferma anche il programma Gambas


wait :
Chiama ricorsivamente il ciclo degli eventi.

Se Ritardo viene specificato, allora la funzione ritorna solo dopo che il tempo specificato in Ritardo non è passato.

Se Ritardo non viene specificato, la funzione processa tutti gli eventi pendenti e ritorna immediatamente. In questo caso gli eventi di input (tastiera e mouse) sono ignorati.



provo a fare qualche esperimento



"e il naufragar m'è dolce in questo mar"

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Bloccare mouse per un certo tempo
« Risposta #7 il: 15 Marzo 2013, 18:08:52 »
......ho notato che solo con Wait riesci ad ottenere un soddisfacente risultato con questo algoritmo (poniamo un Button sul Form):
Codice: gambas [Seleziona]

Public Sub Form_Open()

    Me.show
    Wait 0.1

' Blocca l'oggetto:
      Object.Lock(Button1)

      Wait 4   ' Si resta in attesa per 4 secondi

' Passati i 4 secondi, l'oggetto viene sbloccato:
      Object.Unlock(Button1)
  
      Print " Sono passati 4 secondi."

End


Public Sub Button1_Click()

   If Object.IsLocked(Button1) Then Return   ' Fa sì che durante l'attesa l'evento si "scarichi" nel vuoto...

   Me.Background = Color.Red

End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Bloccare mouse per un certo tempo
« Risposta #8 il: 15 Marzo 2013, 22:41:52 »
@ : Akrobaticone:
Il blocco dediserato  non è riferito a tutti i task attivi in un dato istante, oppure ho capito male?
 :ciao:
:ciao:

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: Bloccare mouse per un certo tempo
« Risposta #9 il: 16 Marzo 2013, 09:59:11 »
il blocco è riferito solo all'interfaccia grafica, in background lavora un timer che periodicamente fa la scansione via seriale di dispositivi esterni
in sostanza viene premuto un tasto start che fa partire un ciclo macchina e l'operatore non deve più interagire con l'interfaccia grafica fino a fine ciclo
potrei semplicemente mettre la proprietà enable a false su tutti i controlli del form, ma cercavo qualche cosa di più elegante
"e il naufragar m'è dolce in questo mar"

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Bloccare mouse per un certo tempo
« Risposta #10 il: 16 Marzo 2013, 18:11:50 »
il blocco è riferito solo all'interfaccia grafica, in background lavora un timer che periodicamente fa la scansione via seriale di dispositivi esterni
in sostanza viene premuto un tasto start che fa partire un ciclo macchina e l'operatore non deve più interagire con l'interfaccia grafica fino a fine ciclo
potrei semplicemente mettre la proprietà enable a false su tutti i controlli del form, ma cercavo qualche cosa di più elegante
Quindi, ti riferisci esclusivamente al blocco operativo del tuo programma fino alla raggiungimento del Time-out.

Se ti dovessi trovare con più Form aperte nel tuo programma, la migliore metodologia sarebbe quella di accedere alle Form in via modale, di modo che Gambas renda inattiva la Form padre, fino a quando il controllo, rimanendo alla Form Figlio ed eventualmente ad altre successive dipendenti, non ritorni alla detta Form padre.
Se invece vuoi bloccare tutti  gli oggetti contenuti nella Form, non devi fare altro, secondo me, di eseguire un semplice
Codice: [Seleziona]
X-Object.Enabled=False
per ciascun oggetto della Form ed aspettare la fine del tempo d'attesa. Ripristinare poi, a fine attesa, tutti gli oggetti invalidati.

Ricorda che, se la Form disponesse anche di una barra di meù, di invalidare tutti i menù contenuti in essa.
 :ciao:
:ciao:

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: Bloccare mouse per un certo tempo
« Risposta #11 il: 17 Marzo 2013, 09:09:32 »
Se ti dovessi trovare con più Form aperte nel tuo programma, la migliore metodologia sarebbe quella di accedere alle Form in via modale, di modo che Gambas renda inattiva la Form padre, fino a quando il controllo, rimanendo alla Form Figlio ed eventualmente ad altre successive dipendenti, non ritorni alla detta Form padre.
Se invece vuoi bloccare tutti  gli oggetti contenuti nella Form, non devi fare altro, secondo me, di eseguire un semplice
Codice: [Seleziona]
X-Object.Enabled=False
per ciascun oggetto della Form ed aspettare la fine del tempo d'attesa. Ripristinare poi, a fine attesa, tutti gli oggetti invalidati.

Ricorda che, se la Form disponesse anche di una barra di meù, di invalidare tutti i menù contenuti in essa.
 :ciao:


in effetti è la soluzione migliore e più semplice
il mouse rimane attivo, ma se gli oggetti non rispondono si vedrà solo il cursore che gira senza nessuna azione
"e il naufragar m'è dolce in questo mar"

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Bloccare mouse per un certo tempo
« Risposta #12 il: 17 Marzo 2013, 10:12:20 »
Di soluzioni ne possono esistere diverse. Un'altra che mi viene in mente potrebbe essere quella di accendere dentro l'evento che avvia il timer,  una variabile booleana (bSemaforo), dichiarata a livello di Form. Interrogarne lo stato dentro l'evento Click di ciascun oggetto ed invalidarne l'esecuzione in caso di  bSemaforo=TRUE.
 :ciao:
:ciao:

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Bloccare mouse per un certo tempo
« Risposta #13 il: 17 Marzo 2013, 10:16:30 »
Se la tua esigenza è quella di bloccare tutti i controlli della form per un dato intervallo di tempo, potresti utilizzare la proprietà Enabled della Form stessa.

Imposti la proprietà a False.
Alla fine del ciclo che esegue il timer la reimposti a TRUE.

In questo modo tutti i controlli sono disabilitati, compresi i menu
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re: Bloccare mouse per un certo tempo
« Risposta #14 il: 17 Marzo 2013, 10:58:44 »
a questa non avevo pensato
ci provo subito
"e il naufragar m'è dolce in questo mar"