Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: Ceskho - 06 Maggio 2009, 16:24:19

Titolo: comando WAIT coinvolge tutti i form
Inserito da: Ceskho - 06 Maggio 2009, 16:24:19
Ho potuto notare uno strano comportamento di Gambas col comando WAIT....

Questo comando infatti, scritto nel codice di un form, al momento del suo lancio coinvolge tutti i form attivi nel momento in cui il comando è in uso...se ad esempio ci sono due form attivi che fanno qualcosa ed uno dei due scatena il comando WAIT allora entrambi smettono di funzionare finchè esso non ha finito....è normale questa cosa o è un bug?
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: leo72 - 06 Maggio 2009, 16:40:56
Uhm.. considerando che il comando WAIT serve a rendere temporaneamente il controllo all'interprete Gambas per controllare l'input dell'utente e rinfrescare la GUI dell'applicazione, immagino che il comportamento descritto sia compatibile con ciò che il comando fa, anche in caso di più form aperti (che, cmq, appartengono sempre ad un'unica applicazione dato che i thread in Gambas non esistono).
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: Ceskho - 06 Maggio 2009, 17:50:56
Ma nel mio caso il WAIT di un form che scarica blocca il timer dell'altro form che dovrebbe cambiare la scritta si un label...così sembra che l'applicazione è ferma mentre invece funziona!
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: md9327 - 06 Maggio 2009, 18:13:36
Credo che, essendo un comando diretto, senza alcun parametro, l'idea sia stata proprio quella di ritornare il controllo all'interprete, a prescindere da cosa stà girando.

Una bella idea sarebbe quella di implementare una funzione analoga, a cui passare un parametro, corrispondente al controllo Parent...
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: leo72 - 06 Maggio 2009, 23:09:10
Non puoi implementare una tua versione di WAIT, magari usando un altro timer nel form che deve controllare i dati generati dall'altro?
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: Ceskho - 07 Maggio 2009, 00:29:41
Non penso sia fattibile perchè il mio wait è posto dopo un comando da shell...
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: md9327 - 07 Maggio 2009, 01:25:28
Usando un EXEC associato ad un Process ???
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: leo72 - 07 Maggio 2009, 06:44:05
Oppure:

1a soluzione:
associare lo SHELL con WAIT associato ad un processo con:
Codice: [Seleziona]

DIM Comando AS String
DIM Processo AS Process
  Comando = "crei la stringa del tuo comando"
  Processo = SHELL (Comando) WAIT

Crei il processo e lo associ ad un oggetto di tipo Process, che poi puoi gestire.

2a soluzione:
usare il reindirizzamento di SHELL su una variabile:
Codice: [Seleziona]

DIM Comando, Risultato AS String
  Comando = "crei la stringa del tuo comando"
  SHELL Comando TO Risultato
  '--gestisci il risultato
  .......

Con questa sintassi l'esecuzione del programma è sospesa fino a quando SHELL non ha terminato l'esecuzione di Comando ed ha restituito il risultato in Risultato.

Questa seconda versione è simile alla prima con la differenza che hai il risultato disponibile in una variabile (es. il suo output: "ls -la").
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: Ceskho - 07 Maggio 2009, 13:22:15
@ Leo

I tuoi comandi non sono molto diversi da ciò che faccio io! Io eseguo un wget in questo modo

SHELL "wget " & file_da_scaricare WAIT

Quindi salto solo il passaggio di assegnare il comando ad una variabile.

Il problema è che ovunque stia WAIT blocca tutto comunque....perchè un'operazione deve pur farla...
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: leo72 - 07 Maggio 2009, 19:41:54
Eh, sì.
Allora è proprio il suo modus operandi. Che, cmq, mi pare piuttosto logico dato che essendo l'applicazione, anche se composta da più form, eseguita da una singola istanza dell'interprete, gira "in blocco" unico.
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: Ceskho - 07 Maggio 2009, 23:25:26
A me personalmente non pare così logica come cosa.....si dovrebbe fare in modo di avere un WAIT un pò più dinamico....che magari possa accettare dei parametri quali possono essere un form op un oggetto o che sò io....
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: md9327 - 08 Maggio 2009, 00:55:04
E perchè no, un multithreading?

Putroppo questa parte di software manca...
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: leo72 - 08 Maggio 2009, 23:12:22
E manco verrà mai implementata.
Ecco la risposta di Benoit data ad un utente che in mailing-list chiedeva dei thread in Gambas (roba di 8 mesi fa):

Citazione

Gambas interpreter was not designed to be multi-threaded at all.

What sort of background process people want to do during their application? I
never had such a need.
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: md9327 - 11 Maggio 2009, 12:05:07
Appunto...
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: - 29 Maggio 2009, 01:15:41
Buonanotte....
Secondo voi avendo il codice allegato dove lo devo schiaffare un WAIT per evitare che mi si freezi l'interfaccia ????
Considerando che non è tanto il loop a freezare ma la dimesione del singolo file che copio a romper le balle ....

Codice: [Seleziona]

FOR EACH item IN source

IF IsDir(item) THEN
MKDIR destination &/ File.Name(item)
            FOR EACH subitem IN RDir(item, "*")
                                                                 IF IsDir(item &/ subitem) THEN
                                           MKDIR destination &/ File.Name(item) &/ subitem
                                  ELSE
                      COPY item &/ subitem TO destination &/ File.Name(item) &/ subitem
                                  ENDIF
            NEXT
ELSE
                      TRY COPY item TO destination &/ File.Name(item)
ENDIF
NEXT

Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: Ceskho - 29 Maggio 2009, 16:24:30
E' illeggibile il codice così....

Comunque fsurfing mi ha illuminato così:
associ ciò che devo fare ad un processo e con un timer controlli sempre in che stato è il processo; non appena restituisce 0 (cioè ha finito) allora vai avanti con il tuo codice....
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: leo72 - 30 Maggio 2009, 16:31:52
Codice: [Seleziona]

DIM hProcess AS Process
FOR EACH item IN source
  IF IsDir(item) THEN
    MKDIR destination &/ File.Name(item)
      FOR EACH subitem IN RDir(item, "*")
        IF IsDir(item &/ subitem) THEN
          hProcess = MKDIR destination &/ File.Name(item) &/ subitem WAIT
        ELSE
          hProcess = COPY item &/ subitem TO destination &/ File.Name(item) &/ subitem WAIT
        ENDIF
      NEXT
  ELSE
    TRY hProcess = COPY item TO destination &/ File.Name(item) WAIT
  ENDIF
NEXT


Prova a far così (non ho provato il codice).
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: - 30 Maggio 2009, 19:45:38
il "processo =" si può usare solo con comandi shell ...
penso sia una limitazione del COPY di gambas .... incricca inevitabilmente la gui quando il file è di dimensioni elevate ... forse farò una micro applicazione esterna che svolga la funzione ( in maniera tale che l'applicazione ad incriccarsi sia un'altra e non la principale ) o mi appoggerò alla SHELL è che con la shell mi diventa problematico gestire gli eventuali messaggi di errore e i messaggi di avvenuta copia ...
Titolo: Re: comando WAIT coinvolge tutti i form
Inserito da: leo72 - 30 Maggio 2009, 22:49:20
Perché allora non usare direttamente il comando "cp" da terminale richiamandolo con Shell? Così risolvi entrambi i problemi.