Autore Topic: il FIFO di gb.data sballa se svuotato da un task  (Letto 5848 volte)

Offline Pino Zollo

  • Gamberetto
  • *
  • Post: 15
  • Pino Zollo ZP4KFX, Italiano emigrato in Paraguay
    • Mostra profilo
il FIFO di gb.data sballa se svuotato da un task
« il: 11 Febbraio 2025, 01:42:08 »
il FIFO in gb.data  funziona....finché non si cerca di svuotarlo da uh task separato....allora succedono cose strane....forse c'è sotto un BUG.

All'inizio la coda q è riempita con 4 elementi e, all'attivare il task, viene giustamente scaricata....ma successivamente, battendo dei caratteri nella TextArea questi vengono aggiunti alla coda come se questa non fosse mai stata scaricata:

Codice: [Seleziona]
Entra nel task
Task Dequeue Primo
Task Size 3
Task Dequeue 123
Task Size 2
Task Dequeue True
Task Size 1
Task Dequeue a
Task Size 0              <-------------    nota che ora il FIFO è scarico... apparentemente
FMain.Form_Open.28: Manico 109662     ....prima parte tutto regolare

....................................

...seconda parte.....batto dei caratteri nella TextArea:

FMain.TextIN_Change.49: Manico 109791
Size aggiunto 5
FMain.TextIN_Change.49: Manico 109791
Size aggiunto 6
FMain.TextIN_Change.49: Manico 109791
Size aggiunto 7
FMain.TextIN_Change.49: Manico 109791
Size aggiunto 8
FMain.TextIN_Change.49: Manico 109791
Size aggiunto 9

La numerazione riprende come se la FIFO non fosse stata scaricata nella parte precedente; il processo di svuotamento è sempre attivo e con lo stesso nº di handle ma no fa niente.

Se poi clicco sul bottone Scarica mi butta fuori tutto ....anche i dati introdotti all'inizio

Codice: [Seleziona]
Primo
123
True
a
z
x
c
v
b

Ora, se riclicco su Scarica non stampa niente....questa volta ha davvero scricato il FIFO.

Sará una delle tante stranezze di Gambas ?

In allegato il programma di test: Test-FIFO-Task
« Ultima modifica: 12 Febbraio 2025, 10:32:39 da Gianluigi »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:il FIFO di gb.data sballa se svuotato da un task
« Risposta #1 il: 11 Febbraio 2025, 18:13:46 »
Secondo me il tuo codice funziona.
La prima volta scrive quello che scarica (sei tu che scrivi Print davanti a q.Dequeue() ) e poi la seconda volta non ha più niente da scrivere e quindi non scrive nulla.

Ti consiglio di scrivere qualcosa di simile nella classe:
Codice: [Seleziona]
Public Sub Ferma()
 
  Me.Stop
 
End

e poi questo in FMain.class:
Codice: [Seleziona]
Public Sub Form_Close()
 
  tSendCW.Ferma
 
End

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Pino Zollo

  • Gamberetto
  • *
  • Post: 15
  • Pino Zollo ZP4KFX, Italiano emigrato in Paraguay
    • Mostra profilo
Re:il FIFO di gb.data sballa se svuotato da un task
« Risposta #2 il: 11 Febbraio 2025, 22:52:34 »
 :'(  Forse ho inviato un programma modificato per funzionare con un timer.

Ora allego il programma con problema con le tue modifiche aggiunte....

e questo è problematico:
Alla partenza fa:
Entra nel task
Codice: [Seleziona]
Task Dequeue Primo
Task Size 3
Task Dequeue 123
Task Size 2
Task Dequeue True
Task Size 1
Task Dequeue a
Task Size 0
FMain.Form_Open.28: Manico 426187

poi, se scrivo qualcosa nel form aggiunge i caratteri al FIFO correttamente, ma il Task non li toglie.

Size aggiunto 5     <---- aggiunge dalla posizione 5....è sbagliato perché il FIFO avrebbe dovuto essere già scarico
Running True
Size aggiunto 6
Running True
Size aggiunto 7
Running True
Size aggiunto 8
Running True
Size aggiunto 9
Running True
Size aggiunto 10
Running True
Size aggiunto 11
Running True
Size aggiunto 12
Running True
Size aggiunto 13
Running True

Se ora schiaccio Scarica i caratteri vengono estratti cominciando dai primi che varebbero dovuto essere già eliminati:
Codice: [Seleziona]
Primo
123
True
a
k
h
s
d
a
h
s
d
k
a
s
k
d
h
------------------------------

Buona notte
Pino
« Ultima modifica: 12 Febbraio 2025, 10:33:35 da Gianluigi »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:il FIFO di gb.data sballa se svuotato da un task
« Risposta #3 il: 12 Febbraio 2025, 10:29:06 »
Il punto è che per ottenere quello che vuoi non puoi usare un loop e l'evento Change funziona come un loop.
Vedi i cambiamenti fatti nel progetto allegato.

Per favore quando inserisci il codice usa i cancelletti, vedi la guida che ti avevo indicato:
https://www.gambas-it.org/smf/index.php?topic=7397.0

 :ciao:
« Ultima modifica: 12 Febbraio 2025, 10:30:27 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Pino Zollo

  • Gamberetto
  • *
  • Post: 15
  • Pino Zollo ZP4KFX, Italiano emigrato in Paraguay
    • Mostra profilo
Re:il FIFO di gb.data sballa se svuotato da un task
« Risposta #4 il: 12 Febbraio 2025, 13:45:49 »
Ho capito cosa intendi....
peró per la mia applicazione necessito che l'introduzione dei caratteri in nella TextArea sia casuale...alla velocità di un umano...e che tali caratteri siano aggiunti al FIFO così come vengono introdotti.

Per l'uso che ne faccio non è possibile andare il "Line mode"

Che alternativa ho per andare in character mode ?

Grazie

Pino

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:il FIFO di gb.data sballa se svuotato da un task
« Risposta #5 il: 12 Febbraio 2025, 14:50:57 »

Che alternativa ho per andare in character mode ?

Grazie

Pino

Intendi qualcosa del genere?
Vedi allegato

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Pino Zollo

  • Gamberetto
  • *
  • Post: 15
  • Pino Zollo ZP4KFX, Italiano emigrato in Paraguay
    • Mostra profilo
Re:il FIFO di gb.data sballa se svuotato da un task
« Risposta #6 il: 12 Febbraio 2025, 15:53:27 »
Sempre l'operatore deve cliccare su ...  btnAdd_Click()  sopo aver scritto qualcosa nella TextArea.

Questo non è fattibile in pratica....

Quello che per me funziona....ma è bruttissimo... è l'implementazione che avevo fatto come workaround nel primo esempio che postai per sbaglio.

In pratica con un timer attivato molto spesso, attivo la funzione q.Dequeue() che estrae il carattere dalla coda e lo invia alla porta USB e quindi all'harware esterno.

Dal punto di vista della mia applicazione questo sistema (orribile) funziona.... ma mi sembra un BUG il fatto che con un Task succedano cose strane.

In generale sento molto la mancanza in Gambas di un vero sistema di multitasking ....

Vedi l'altro post su gb.thread che ho fatto nella lista dei "Componenti"

Saluti
Pino

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:il FIFO di gb.data sballa se svuotato da un task
« Risposta #7 il: 12 Febbraio 2025, 16:07:52 »
E non puoi far fare i click al timer ogni tot periodo?
È difficile capire quello che vuoi ottenere  :-\
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Pino Zollo

  • Gamberetto
  • *
  • Post: 15
  • Pino Zollo ZP4KFX, Italiano emigrato in Paraguay
    • Mostra profilo
Re:il FIFO di gb.data sballa se svuotato da un task
« Risposta #8 il: 12 Febbraio 2025, 16:14:08 »
nessun click al timer....il timer va da solo

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:il FIFO di gb.data sballa se svuotato da un task
« Risposta #9 il: 12 Febbraio 2025, 16:27:23 »
nessun click al timer....il timer va da solo

Non capisco cosa intendi, vedi test allegato
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Pino Zollo

  • Gamberetto
  • *
  • Post: 15
  • Pino Zollo ZP4KFX, Italiano emigrato in Paraguay
    • Mostra profilo
Re:il FIFO di gb.data sballa se svuotato da un task
« Risposta #10 il: 12 Febbraio 2025, 19:15:41 »
Capito....

comunque dentro la sub del timer si può mettere tutto come nel primo programma che inviai per sbaglio...
Non occore mettre il codice nei bottoni  manuali.

Era questo che mi confondeva.

Ad ogni modo, il workaround del timer permette al mio applicativo di funzionare correttamente.

Per Gambas resta il BUG del funzionamento con Task.