Visualizza post

Questa sezione ti permette di visualizzare tutti i post inviati da questo utente. N.B: puoi vedere solo i post relativi alle aree dove hai l'accesso.


Post - Pino Zollo

Pagine: [1]
1
Intelligenza artificiale / Re:Gambas3 e AI
« il: 12 Febbraio 2025, 19:24:56 »
Anche io ho Ollama istallato... ma come posso istruirla su cose che neanche io so ?

Sarebbe bello che qualcuno lo facesse ed aggiungesse questa funzionalità nell'IDE, in modo che allo scrivere codice arrivassero suggerimenti buoni....

.... anche a fini didattici....

2
Intelligenza artificiale / Re:gb.therad
« il: 12 Febbraio 2025, 19:21:02 »
Cerco qualche anima gentile che sappia fare un componente per i thread....

Sicuro che in questo gruppo qualcuno con la capacità ed il tempo si trova.....

3
Programmazione / Re:il FIFO di gb.data sballa se svuotato da un task
« 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.

4
Programmazione / Re:il FIFO di gb.data sballa se svuotato da un task
« il: 12 Febbraio 2025, 16:14:08 »
nessun click al timer....il timer va da solo

5
Programmazione / Re:il FIFO di gb.data sballa se svuotato da un task
« 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

6
Programmazione / Re:il FIFO di gb.data sballa se svuotato da un task
« 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

7
Programmazione / Re:il FIFO di gb.data sballa se svuotato da un task
« 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

8
Intelligenza artificiale / gb.therad
« il: 11 Febbraio 2025, 18:22:57 »
Ho chiesto a DeepSeek: "Se volessi scriver una nuova gb.thread migliorata, chiamiamola gb.thread2, come faresti  ?"
...queto perché DeepSeek continua ad affermare che in Gambas esiste gb.thread ;-)  :rolleyes:
Per i miei programmi che usano pesantemente l' I/O una componenete di Thread sarebbe utilissima...ed ecco la risposta:
-----------------------------------------
Ecco un progetto concettuale per implementare una **gb.thread2** migliorata in Gambas3, con funzionalità avanzate e maggiore sicurezza. Per farlo, dovresti estendere il componente **gb.thread** esistente o crearne uno nuovo da zero, integrandolo con il core di Gambas. Di seguito, trovi il piano dettagliato.

Codice: [Seleziona]
---

### **Architettura di `gb.thread2`**
#### 1. **Obiettivi Principali**
- **Gestione avanzata dei thread** (pool di thread, priorità, ereditarietà).
- **Sincronizzazione migliorata** (semaphore, read-write lock, condition variables).
- **Supporto a future/promise** per risultati asincroni.
- **Thread-safe data structures** (code atomiche, cache condivisa).
- **Monitoraggio delle risorse** (debugging integrato, statistiche).

---

### **Funzionalità Chiave**
#### 1. **Thread Pool (Gestione Efficiente)**
```vb
' Esempio di utilizzo
Dim Pool As ThreadPool = New ThreadPool(4) ' 4 thread worker

Public Sub Main()
  Pool.Submit(AddressOf Task1, 123)
  Pool.Submit(AddressOf Task2, "test")
  Pool.WaitAll() ' Attende il completamento
End Sub

Private Sub Task1(Arg As Integer)
  Print "Task 1: ", Arg
End Sub

Private Sub Task2(Arg As String)
  Print "Task 2: ", Arg
End Sub
```

#### 2. **Sincronizzazione Avanzata**
- **ReadWriteLock**: Ottimizza l’accesso in lettura/scrittura.
- **CountdownLatch**: Sincronizza task multipli.
- **Semaphore**: Gestione di risorse limitate.

```vb
Dim RWLock As ReadWriteLock = New ReadWriteLock

Public Sub LeggiDati()
  RWLock.LockRead()
  ' ... operazioni di lettura ...
  RWLock.UnlockRead()
End Sub

Public Sub ScriviDati()
  RWLock.LockWrite()
  ' ... operazioni di scrittura ...
  RWLock.UnlockWrite()
End Sub
```

#### 3. **Future/Promise per Risultati Asincroni**
```vb
Dim FutureResult As Future = Thread.RunAsync(AddressOf CalcoloComplesso)

Public Sub Main()
  FutureResult.Wait()
  Print "Risultato: ", FutureResult.Value
End Sub

Private Function CalcoloComplesso() As Variant
  Return 42
End Function
```

#### 4. **Strutture Dati Thread-Safe**
```vb
Dim SafeQueue As ConcurrentQueue = New ConcurrentQueue

Public Sub Producer()
  For i As Integer = 1 To 100
    SafeQueue.Enqueue(i)
  Next
End Sub

Public Sub Consumer()
  While Not SafeQueue.IsEmpty()
    Print SafeQueue.Dequeue()
  Wend
End Sub
```

---

### **Implementazione Tecnica**
#### 1. **Integrazione con il Core di Gambas**
- **Linguaggio:** Il componente deve essere scritto in **C** (come il core di Gambas) per accedere direttamente alle API del sistema (es. `pthread`).
- **Struttura del Codice:**
  - **`gb.thread2.h`**: Dichiarazioni delle classi e metodi.
  - **`gb.thread2.c`**: Implementazione delle funzionalità.
  - **`main.h`**/**`main.c`** : Registrazione del componente in Gambas.

#### 2. **Classi Principali da Implementare**
| Classe             | Descrizione                                                                 |
|---------------------|-----------------------------------------------------------------------------|
| **ThreadPool**      | Gestisce un pool di thread riutilizzabili.                                  |
| **ReadWriteLock**   | Lock per ottimizzare accessi multipli in lettura e singoli in scrittura.    |
| **Future**          | Rappresenta un risultato asincrono calcolato da un thread.                 |
| **ConcurrentQueue** | Coda FIFO thread-safe.                                                     |

#### 3. **Esempio di Codice C per `ConcurrentQueue`**
```c
// File: gb.thread2/concurrentqueue.c
#include "gb.thread2.h"

// Struttura interna della coda
typedef struct {
  pthread_mutex_t mutex;
  GB_ARRAY queue;
} ConcurrentQueue;

// Inizializzazione
void ConcurrentQueue_new(ConcurrentQueue *this) {
  pthread_mutex_init(&this->mutex, NULL);
  this->queue = GB.Array.New(GB_TYPE_VARIANT, 0);
}

// Aggiunge un elemento
void ConcurrentQueue_Enqueue(ConcurrentQueue *this, GbVariant *value) {
  pthread_mutex_lock(&this->mutex);
  GB.Array.Add(this->queue, value);
  pthread_mutex_unlock(&this->mutex);
}

// Rimuove un elemento
GbVariant* ConcurrentQueue_Dequeue(ConcurrentQueue *this) {
  pthread_mutex_lock(&this->mutex);
  GbVariant *value = NULL;
  if (GB.Array.Count(this->queue) > 0) {
    value = GB.Array.Get(this->queue, 0);
    GB.Array.RemoveAt(this->queue, 0);
  }
  pthread_mutex_unlock(&this->mutex);
  return value;
}
```

---

### **Passaggi per Compilare e Testare**
1. **Configurazione del Progetto:**
   - Crea una cartella `gb.thread2` nella directory `src` del codice sorgente di Gambas.
   - Aggiungi i file sorgente (`gb.thread2.h`, `gb.thread2.c`, etc.).

2. **Integrazione con Gambas:**
   - Modifica `configure.ac` e `Makefile.am` per includere il nuovo componente.
   - Riconfigura e ricompila Gambas:
     ```bash
     autoreconf -fvi
     ./configure --enable-thread2
     make
     ```

3. **Test nel IDE Gambas:**
   - Crea un nuovo progetto e abilita il componente `gb.thread2`.
   - Utilizza le nuove classi come nell’esempio sopra.

---

### **Alternative per Chi Non Vuole Scrivere in C**
Se non puoi scrivere codice C, puoi simulare alcune funzionalità con classi Gambas esistenti, anche se meno efficienti:
```vb
' Classe ThreadPool in puro Gambas (pseudo-codice)
Class ThreadPool
  Private Tasks As New Collection
  Private Workers As New Collection
  Private Mutex As Mutex

  Public Sub Constructor(MaxThreads As Integer)
    For i As Integer = 1 To MaxThreads
      Workers.Add(New Thread(AddressOf Worker))
      Workers[i].Start()
    Next
  End Sub

  Public Sub Submit(Task As Sub, Arg As Variant)
    Mutex.Lock()
    Tasks.Add([Task, Arg])
    Mutex.Unlock()
  End Sub

  Private Sub Worker()
    While True
      Mutex.Lock()
      If Tasks.Count > 0 Then
        Dim Job As Variant = Tasks[0]
        Tasks.RemoveAt(0)
        Mutex.Unlock()
        Call Job[0](Job[1])
      Else
        Mutex.Unlock()
        Sleep(100)
      End If
    Wend
  End Sub
End Class
```

---

### **Risorse Utili**
1. **Documentazione di Gambas3:** 
   [Gambas Wiki - Component Development](https://gambaswiki.org/wiki/doc/component) 
2. **Libro "Gambas Programming"** (Capitolo su Thread e sincronizzazione). 
3. **Codice Sorgente di `gb.thread`:** 
   Studia `src/gb.thread` nel codice sorgente di Gambas per capire l’integrazione con il linguaggio.

---

Se hai bisogno di chiarimenti su uno specifico aspetto tecnico, chiedi pure! 😊
---------------------------------------------------------------------------

C'è qualcuno esperto che vorrebbe cimentarsi in questa avventura ?

Saluti Pino ZP4KFX

9
Programmazione / 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

10
Programmazione / Re:Due connessioni UDP
« il: 08 Aprile 2020, 03:39:09 »
Potresti provare :-\ a differenziare l'apertura delle porte di ciascun Arduino in due distinte Classi
La porta del primo Arduino la apri - ad esempio - nella Classe principale; quella del secondo la apri in una Classe secondaria appositamente creata via codice ed ovviamente richiamata in/da quella principale.

Ad esempio, quindi nella Classe principale:
Codice: [Seleziona]
Public cl As New Class1


Public Sub Main()

' Invochiamo la sub-procedura della Classe secondaria per aprire e leggere la porta del "secondo" Arduino:
  cl.ApreSecondoArduino()

' Qui invece viene aperta la porta del "primo" Arduino:
  ...etc...
  ...etc...

End


Public Sub UDPServer_Read()

' Qui in codice per leggere la porta del "primo" Arduino:
   .........
   ...etc....

Ovviamente nella Classe secondaria sarà posto il codice analogo necessario per aprire e leggere la porta del secondo Arduino.

Se capisco bene dovrei fare due Form, in uno gestico una connessione e nell'altro la seconda.....

C'é  modo di farlo via istruzioni ?...senza un secondo Form ?
Grazie.

11
Programmazione / Re:Due connessioni UDP
« il: 06 Aprile 2020, 19:58:59 »
Non mi permette di avere 2 Server_Read

12
Programmazione / Due connessioni UDP
« il: 06 Aprile 2020, 17:30:24 »
Ciao...
Il mio programma cerca di parlare con due Arduino (ESP32, Wamos ESP8266) via Wi-Fi in UDP.
I due Arduino si collegano al PC usando IP statici differenti....e porte differenti.
Il programma Gambas3 fa polling e gli Arduino rispondono solo se interrogati.
Con uno va tutto bene....
...ma le cose mi si confondono se aggiungo un altro Socket nel form.

la Public Sub UDPServer_Read()  sembra essere unica, cioè non differenziabile fra i due Socket.

Si può fare con un solo Socket ?
Grazie
Pino ZP4KFX

13
Programmazione / Re:DrawingArea
« il: 06 Aprile 2020, 17:08:27 »
 [Risolto]

14
Programmazione / Re:DrawingArea
« il: 06 Aprile 2020, 17:06:19 »
OK Grazie....funziona bene :ok:

15
Programmazione / DrawingArea [Risolto]
« il: 05 Aprile 2020, 00:38:20 »
Ciao....
Vorrei ottenere le coordinate del mouse in una DrawingArea....

Ho :

Codice: [Seleziona]
Public Sub DwgElevation_MouseDown()

 Debug "Coordinate  " & Str(DwgElevation.X) & "   " & Str(DwgElevation.Y)

End

Public Sub DwgElevation_DblClick()

  Debug "DC Coordinate  " & Str(DwgElevation.ScreenY) & "   " & Str(DwgElevation.ScreenX)

End

.... ma dovunque clicchi ottengo sempre gli stessi numeri....le coordinate dell'angolo in alto a sinistra della DrawingArea con MouseDown... (X e Y della medesima)

Anche il DblClick mi da sempre nueri uguali...

Qualche suggerimento ?

Grazie
Pino




Pagine: [1]