Differenze tra le versioni di "Inviare dati da un programma Gambas ad un altro mediante le risorse del Componente DBus"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "Come è noto, ''DBus'' è un "sistema bus di messaggi", cioè un programma che può passare diversi tipi di messaggi tra le applicazioni. Il sistema ''DBus'' è supportato in...")
 
 
(7 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Come è noto, ''DBus'' è un "sistema bus di messaggi", cioè un programma che può passare diversi tipi di messaggi tra le applicazioni. Il sistema ''DBus'' è supportato in Gambas 3, dal Componente ''gb.dbus''. Tale Componente consente, pertanto, di  consentire la trasmissione di dati tra due programmi Gambas.
+
Come è noto, ''DBus'' è un "sistema bus di messaggi", cioè un programma che può passare diversi tipi di messaggi tra le applicazioni. Il sistema ''DBus'' è supportato in Gambas 3, dal Componente ''gb.dbus''. Tale Componente consente, pertanto, la trasmissione di dati tra due programmi Gambas.
 +
<BR>Va precisato che ''DBus'' (''Desktop Bus'') lavora con i programmi attivi sullo <SPAN Style="text-decoration:underline>stesso desktop</span>.
  
  
Mostriamo un esempio pratico, nel quale abbiamo due programmi, che chiameremo "''Programma A''" e "''Programma B''". Il "''Programma A''" farà da ''Client'', ed il "''Programma B''" farà da ''Server''.
+
Mostriamo un esempio pratico <SUP>[ [[#Note|nota 1]] ]</sup>, nel quale abbiamo due programmi, che chiameremo esattamente (rispettando maiuscole e minuscole): "''dBus-cli'' " e "''dbus-srv'' ".
 +
<BR>Il programma "''dBus-cli'' " farà da ''Client'', ed il programma "''dbus-srv'' " farà da ''Server''.
  
Il "''Programma A''" invierà al "''Programma B''" dei dati numerici ed un informazione sul tipo di operazione che dovrà essere compiuta dal programa ''Server'' con quei numeri. Il "''Programma B''", intercettati detti dati numerici e l'informazione predetta, compirà il tipo di operazione richiesta dal ''Client'' attraverso l'informazione ricevuta insieme coi dati numerici. Effettuata l'operazione matematica dovuta, il "''Programma B''" invierà il risultato al "''Programma A''".
+
Il programma "''dBus-cli'' " invierà al programma "''dbus-srv'' " dei dati numerici ed un informazione sul tipo di operazione che dovrà essere compiuta dal programa ''Server'' con quei numeri. Il programma "''dbus-srv'' ", intercettati detti dati numerici e l'informazione predetta, compirà il tipo di operazione richiesta dal ''Client'' attraverso l'informazione ricevuta insieme coi dati numerici. Effettuata l'operazione matematica dovuta, il programma "''dbus-srv'' " invierà il risultato al programma "''dBus-cli'' ".
  
 +
Per vederne il funzionamento occorre prima lanciare il programma ''Server'', poi quindi il programma ''Client''.
  
Il "''Programma A''" conterrà sul proprio ''Form'':
+
 
 +
====Codice delle Classi costituenti il programma "dBus-cli"====
 +
Il programma "''dBus-cli'' " conterrà sul proprio ''Form'':
 
* 3 ''ValueBox'': nel 1° e nel 2° ''ValueBox'' sono impostati rispettivamente il primo ed il secondo valore numerico da inviare;
 
* 3 ''ValueBox'': nel 1° e nel 2° ''ValueBox'' sono impostati rispettivamente il primo ed il secondo valore numerico da inviare;
 
* 1 ''ComboBox'': con il quale si sceglierà il tipo di operazione aritmetica da compiere (moltiplicazione, divisione, addizione, sottrazione)
 
* 1 ''ComboBox'': con il quale si sceglierà il tipo di operazione aritmetica da compiere (moltiplicazione, divisione, addizione, sottrazione)
 
* 1 ''Button'': serve per inviare i dati al programma ''Server''.
 
* 1 ''Button'': serve per inviare i dati al programma ''Server''.
  
Inoltre il "''Programma A''" conterrà due Classi. Nella Classe principale, quella del ''Form'', è contenuto il seguente codice:
+
Inoltre il programma "''dBus-cli'' " conterrà due Classi. Nella Classe principale, quella del ''Form'', è contenuto il seguente codice:
Private $hDBus As DBusSignal
 
 
  Private $sApplicationName As String
 
  Private $sApplicationName As String
 
  Private $bNoServer As Boolean
 
  Private $bNoServer As Boolean
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
+
  Dim aList As String[]
+
  Dim aList As String[]
  Dim i As Integer
+
  Dim i As Integer
 
+
 +
  ValueBox1.Value = 5 ' Operando 1
 +
  ValueBox2.Value = 6 ' Operando 2
 +
  ValueBox3.Value = 1 ' Tempo
 +
  With ComboBox1
 +
    .Add("moltiplica")
 +
    .Add("dividi")
 +
    .Add("somma")
 +
    .Add("sottrai")
 +
  End With
 +
  Button1.Text = "Calcola"
 
   aList = DBus.Session.Applications.Sort(gb.Descent)
 
   aList = DBus.Session.Applications.Sort(gb.Descent)
 
 
 
    
 
    
 
   For i = 0 To aList.Max
 
   For i = 0 To aList.Max
Riga 41: Riga 54:
 
   DBus.Session.Register(DbusRisp, "/DbusRisp")
 
   DBus.Session.Register(DbusRisp, "/DbusRisp")
 
    
 
    
  '''End'''
+
  End
 +
 
   
 
   
 +
Public Sub Form_Close()
 
   
 
   
'''Public''' Sub Form_Close()
 
 
 
 
   If $bNoServer = False Then DBus.Session.Unregister(DbusRisp)   
 
   If $bNoServer = False Then DBus.Session.Unregister(DbusRisp)   
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Risp_Sblocco()
+
  Public Sub Risp_Sblocco()
 
    
 
    
 
   Button1.Enabled = True
 
   Button1.Enabled = True
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
+
 
 
   Select Case LCase$(ComboBox1.Text)
 
   Select Case LCase$(ComboBox1.Text)
 
     Case "moltiplica"
 
     Case "moltiplica"
Riga 78: Riga 91:
 
   Button1.Enabled = True
 
   Button1.Enabled = True
 
    
 
    
  '''End'''
+
  End
  
  
Il codice della seconda Classe, contenuta nel "''Programma A''", e che sarà chiamata ad esempio "''DBusRisp.class''", sarà il seguente:
+
Il codice della seconda Classe, contenuta nel programa "''dBus-cli'' " e che sarà chiamata in questo caso esattamente "''DBusRisp.class'' ", sarà il seguente:
 
  Inherits DBusObject
 
  Inherits DBusObject
 
   
 
   
Riga 89: Riga 102:
 
   
 
   
 
   
 
   
  '''Public''' Function Risposta(Evento As String, Operazione As Integer, Valore1 As Float, Valore2 As Float, Risultato As Float) As Boolean
+
  Public Function Risposta(Evento As String, Operazione As Integer, Valore1 As Float, Valore2 As Float, Risultato As Float) As Boolean
 
   
 
   
  Dim sSymbol As String[]
+
  Dim sSymbol As String[]
 
    
 
    
 
   sSymbol = ["*", "/", "+", "-"]
 
   sSymbol = ["*", "/", "+", "-"]
Riga 101: Riga 114:
 
   Return True
 
   Return True
 
    
 
    
  '''End'''
+
  End
  
  
 
+
====Codice delle Classi costituenti il programma "dbus-srv"====
Il "''Programma B''" che fa da ''Server'', e che - come già detto - deve compiere l'operazione aritmetica richiesta, avrà sul proprio ''Form'' Semplicemente una ''Label''.
+
Il programma "''dbus-srv'' " che fa da ''Server'', e che - come già detto - deve compiere l'operazione aritmetica richiesta, avrà sul proprio ''Form'' Semplicemente una ''Label''.
  
 
Anche questo programma avrà due Classi. Nella Classe principale, quella del ''Form'', sarà contenuto il seguente codice:
 
Anche questo programma avrà due Classi. Nella Classe principale, quella del ''Form'', sarà contenuto il seguente codice:
Riga 111: Riga 124:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
    
 
    
 
   DBus.Session.Register(Calcoli, "/Calcoli")
 
   DBus.Session.Register(Calcoli, "/Calcoli")
 
   Object.Attach(Calcoli, Me, "c")
 
   Object.Attach(Calcoli, Me, "c")
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub c_Messaggi(Testo As String)
+
  Public Sub c_Messaggi(Testo As String)
 
    
 
    
   Label2.Text = Testo
+
   Label1.Text = Testo
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Close()
+
  Public Sub Form_Close()
 
    
 
    
 
   If $bNoServer = False Then DBus.Session.Unregister(Calcoli)
 
   If $bNoServer = False Then DBus.Session.Unregister(Calcoli)
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Function NomeClient() As String
+
  Public Function NomeClient() As String
 
    
 
    
  Dim aList As String[]
+
  Dim aList As String[]
  Dim i As Integer
+
  Dim i As Integer
  Dim s As String
+
  Dim s As String
 
    
 
    
 
   aList = DBus.Session.Applications.Sort(gb.Descent)
 
   aList = DBus.Session.Applications.Sort(gb.Descent)
 
    
 
    
 
   For i = 0 To aList.Max
 
   For i = 0 To aList.Max
     Print aList[i]
+
     <FONT Color=gray>' Print aList[i]</font>
 
     If aList[i] Begins "org.gambas.dBus-cli-" Then
 
     If aList[i] Begins "org.gambas.dBus-cli-" Then
 
       s = aList[i]
 
       s = aList[i]
Riga 156: Riga 169:
 
   Endif
 
   Endif
 
    
 
    
  '''End'''
+
  End
  
  
Il codice della seconda Classe, contenuta nel "''Programma B''", e che sarà chiamata ad esempio "''Calcoli.class''", sarà il seguente:
+
Il codice della seconda Classe, contenuta nel programma "''dbus-srv'' " e che sarà chiamata in questo caso esattamente "''Calcoli.class'' ", sarà il seguente:
 
  Inherits DBusObject
 
  Inherits DBusObject
 
   
 
   
Riga 173: Riga 186:
 
   
 
   
 
   
 
   
  '''Public''' Function Moltiplica(Valore1 As Float, Valore2 As Float, Tempo As Integer) As Float
+
  Public Function Moltiplica(Valore1 As Float, Valore2 As Float, Tempo As Integer) As Float
 
    
 
    
 
   $fRisult = Valore1 * Valore2
 
   $fRisult = Valore1 * Valore2
Riga 183: Riga 196:
 
   Raise Messaggi(Subst("Mi richiedono di fare una moltiplicazione \n La eseguirò tra &1 second&2.", Tempo, IIf(Tempo / 1000 = 1, "o", "i")))
 
   Raise Messaggi(Subst("Mi richiedono di fare una moltiplicazione \n La eseguirò tra &1 second&2.", Tempo, IIf(Tempo / 1000 = 1, "o", "i")))
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Function Dividi(Valore1 As Float, Valore2 As Float, Tempo As Integer) As Float
+
  Public Function Dividi(Valore1 As Float, Valore2 As Float, Tempo As Integer) As Float
 
    
 
    
 
   $fRisult = Valore1 / Valore2
 
   $fRisult = Valore1 / Valore2
Riga 196: Riga 209:
 
   Raise Messaggi(Subst("Mi richiedono di fare una divisione \n La eseguirò tra &1 second&2.", Tempo, IIf(Tempo = 1, "o", "i")))
 
   Raise Messaggi(Subst("Mi richiedono di fare una divisione \n La eseguirò tra &1 second&2.", Tempo, IIf(Tempo = 1, "o", "i")))
 
    
 
    
  '''End'''
+
  End  
 
   
 
   
 
   
 
   
  '''Public''' Function Somma(Valore1 As Float, Valore2 As Float, Tempo As Integer) As Float
+
  Public Function Somma(Valore1 As Float, Valore2 As Float, Tempo As Integer) As Float
 
    
 
    
 
   $fRisult = Valore1 + Valore2
 
   $fRisult = Valore1 + Valore2
Riga 209: Riga 222:
 
   Raise Messaggi(Subst("Mi richiedono di fare una somma \n La eseguirò tra &1 second&2.", Tempo, IIf(Tempo = 1, "o", "i")))
 
   Raise Messaggi(Subst("Mi richiedono di fare una somma \n La eseguirò tra &1 second&2.", Tempo, IIf(Tempo = 1, "o", "i")))
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Function Sottrai(Valore1 As Float, Valore2 As Float, Tempo As Integer) As Float   
+
  Public Function Sottrai(Valore1 As Float, Valore2 As Float, Tempo As Integer) As Float   
 
    
 
    
 
   $fRisult = Valore1 - Valore2
 
   $fRisult = Valore1 - Valore2
Riga 222: Riga 235:
 
   Raise Messaggi(Subst("Mi richiedono di fare una sottrazione \nLa eseguirò tra &1 second&2.", Tempo, IIf(Tempo = 1, "o", "i")))
 
   Raise Messaggi(Subst("Mi richiedono di fare una sottrazione \nLa eseguirò tra &1 second&2.", Tempo, IIf(Tempo = 1, "o", "i")))
 
    
 
    
  '''End'''
+
  End  
 
   
 
   
 
   
 
   
  '''Public''' Sub t_Timer()
+
  Public Sub t_Timer()
 
 
  Dim s As String
 
 
    
 
    
 +
  Dim s As String
 +
 
   s = FMain.NomeClient()
 
   s = FMain.NomeClient()
 
   t.Stop()
 
   t.Stop()
Riga 238: Riga 251:
 
     Message.Error("Evidentemente il mio padrone è assente... ")
 
     Message.Error("Evidentemente il mio padrone è assente... ")
 
    
 
    
  '''End'''
+
  End
 
 
  
  

Versione attuale delle 12:45, 22 giu 2024

Come è noto, DBus è un "sistema bus di messaggi", cioè un programma che può passare diversi tipi di messaggi tra le applicazioni. Il sistema DBus è supportato in Gambas 3, dal Componente gb.dbus. Tale Componente consente, pertanto, la trasmissione di dati tra due programmi Gambas.
Va precisato che DBus (Desktop Bus) lavora con i programmi attivi sullo stesso desktop.


Mostriamo un esempio pratico [ nota 1 ], nel quale abbiamo due programmi, che chiameremo esattamente (rispettando maiuscole e minuscole): "dBus-cli " e "dbus-srv ".
Il programma "dBus-cli " farà da Client, ed il programma "dbus-srv " farà da Server.

Il programma "dBus-cli " invierà al programma "dbus-srv " dei dati numerici ed un informazione sul tipo di operazione che dovrà essere compiuta dal programa Server con quei numeri. Il programma "dbus-srv ", intercettati detti dati numerici e l'informazione predetta, compirà il tipo di operazione richiesta dal Client attraverso l'informazione ricevuta insieme coi dati numerici. Effettuata l'operazione matematica dovuta, il programma "dbus-srv " invierà il risultato al programma "dBus-cli ".

Per vederne il funzionamento occorre prima lanciare il programma Server, poi quindi il programma Client.


Codice delle Classi costituenti il programma "dBus-cli"

Il programma "dBus-cli " conterrà sul proprio Form:

  • 3 ValueBox: nel 1° e nel 2° ValueBox sono impostati rispettivamente il primo ed il secondo valore numerico da inviare;
  • 1 ComboBox: con il quale si sceglierà il tipo di operazione aritmetica da compiere (moltiplicazione, divisione, addizione, sottrazione)
  • 1 Button: serve per inviare i dati al programma Server.

Inoltre il programma "dBus-cli " conterrà due Classi. Nella Classe principale, quella del Form, è contenuto il seguente codice:

Private $sApplicationName As String
Private $bNoServer As Boolean


Public Sub Form_Open()

  Dim aList As String[]
  Dim i As Integer

  ValueBox1.Value = 5 ' Operando 1
  ValueBox2.Value = 6 ' Operando 2
  ValueBox3.Value = 1 ' Tempo
  With ComboBox1
    .Add("moltiplica")
    .Add("dividi")
    .Add("somma")
    .Add("sottrai")
  End With
  Button1.Text = "Calcola"
  aList = DBus.Session.Applications.Sort(gb.Descent)
  
  For i = 0 To aList.Max
    If aList[i] Begins "org.gambas.dbus-srv-" Then
      $sApplicationName = aList[i]
      Print $sApplicationName
    Endif    
  Next
  If IsNull($sApplicationName) Then
    Message.Error("Impossibile contattare il server", "OK")    
    $bNoServer = True
    Me.Close
    Return
  Endif
  Object.Attach(DbusRisp, Me, "Risp")
  DBus.Session.Register(DbusRisp, "/DbusRisp")
  
End


Public Sub Form_Close()

  If $bNoServer = False Then DBus.Session.Unregister(DbusRisp)  
  
End


Public Sub Risp_Sblocco()
 
  Button1.Enabled = True
  
End


Public Sub Button1_Click()
 
  Select Case LCase$(ComboBox1.Text)
    Case "moltiplica"
      DBus[$sApplicationName]["/Calcoli"].Moltiplica(ValueBox1.Value, ValueBox2.Value, ValueBox3.Value)
    Case "dividi"
      DBus[$sApplicationName]["/Calcoli"].Dividi(ValueBox1.Value, ValueBox2.Value, ValueBox3.Value)
    Case "somma"
      DBus[$sApplicationName]["/Calcoli"].Somma(ValueBox1.Value, ValueBox2.Value, ValueBox3.Value)
    Case "sottrai"
      DBus[$sApplicationName]["/Calcoli"].Sottrai(ValueBox1.Value, ValueBox2.Value, ValueBox3.Value)
  End Select
  
  Button1.Enabled = False
  
  Catch
    Message.Error("Evidentementi lo schiavo non è attivo...")
  
  Button1.Enabled = True
  
End


Il codice della seconda Classe, contenuta nel programa "dBus-cli " e che sarà chiamata in questo caso esattamente "DBusRisp.class ", sarà il seguente:

Inherits DBusObject

Create Static

Event Sblocco


Public Function Risposta(Evento As String, Operazione As Integer, Valore1 As Float, Valore2 As Float, Risultato As Float) As Boolean

  Dim sSymbol As String[]
 
  sSymbol = ["*", "/", "+", "-"]
  If Evento = "Risultato" Then
    Message.Info(Subst$("Comunicazione dello schiavo:\n&1 &2 &3 = &4", Valore1, sSymbol[Operazione], Valore2, Risultato))
    Raise Sblocco
  End If
  
  Return True
  
End


Codice delle Classi costituenti il programma "dbus-srv"

Il programma "dbus-srv " che fa da Server, e che - come già detto - deve compiere l'operazione aritmetica richiesta, avrà sul proprio Form Semplicemente una Label.

Anche questo programma avrà due Classi. Nella Classe principale, quella del Form, sarà contenuto il seguente codice:

Private $bNoServer As Boolean


Public Sub Form_Open()
 
  DBus.Session.Register(Calcoli, "/Calcoli")
  Object.Attach(Calcoli, Me, "c")
 
End


Public Sub c_Messaggi(Testo As String)
 
  Label1.Text = Testo
  
End


Public Sub Form_Close()
 
  If $bNoServer = False Then DBus.Session.Unregister(Calcoli)
  
End


Public Function NomeClient() As String
 
  Dim aList As String[]
  Dim i As Integer
  Dim s As String
 
  aList = DBus.Session.Applications.Sort(gb.Descent)
  
  For i = 0 To aList.Max
    ' Print aList[i]
    If aList[i] Begins "org.gambas.dBus-cli-" Then
      s = aList[i]
      Print s
      Return s
    Endif    
  Next
  If IsNull(s) Then
    Message.Error("Impossibile contattare il client", "OK")    
    $bNoServer = True
    FMain.Close
    Return
  Endif
  
End


Il codice della seconda Classe, contenuta nel programma "dbus-srv " e che sarà chiamata in questo caso esattamente "Calcoli.class ", sarà il seguente:

Inherits DBusObject

Create Static

Private t As New Timer As "t"
Private $fRisult As Float
Private $iV1 As Float
Private $iV2 As Float
Private $iOp As Integer

Event Messaggi(Testo As String)


Public Function Moltiplica(Valore1 As Float, Valore2 As Float, Tempo As Integer) As Float
 
  $fRisult = Valore1 * Valore2
  $iV1 = Valore1
  $iV2 = Valore2
  $iOp = 0
  t.Delay = Tempo * 1000
  t.Start()
  Raise Messaggi(Subst("Mi richiedono di fare una moltiplicazione \n La eseguirò tra &1 second&2.", Tempo, IIf(Tempo / 1000 = 1, "o", "i")))
  
End


Public Function Dividi(Valore1 As Float, Valore2 As Float, Tempo As Integer) As Float
  
  $fRisult = Valore1 / Valore2
  $iV1 = Valore1
  $iV2 = Valore2
  $iOp = 1
  t.Delay = Tempo * 1000
  t.Start()
  Raise Messaggi(Subst("Mi richiedono di fare una divisione \n La eseguirò tra &1 second&2.", Tempo, IIf(Tempo = 1, "o", "i")))
  
End 


Public Function Somma(Valore1 As Float, Valore2 As Float, Tempo As Integer) As Float
 
  $fRisult = Valore1 + Valore2
  $iV1 = Valore1
  $iV2 = Valore2
  $iOp = 2
  t.Delay = Tempo * 1000
  t.Start()
  Raise Messaggi(Subst("Mi richiedono di fare una somma \n La eseguirò tra &1 second&2.", Tempo, IIf(Tempo = 1, "o", "i")))
  
End


Public Function Sottrai(Valore1 As Float, Valore2 As Float, Tempo As Integer) As Float  
 
  $fRisult = Valore1 - Valore2
  $iV1 = Valore1
  $iV2 = Valore2
  $iOp = 3
  t.Delay = Tempo * 1000
  t.Start()
  Raise Messaggi(Subst("Mi richiedono di fare una sottrazione \nLa eseguirò tra &1 second&2.", Tempo, IIf(Tempo = 1, "o", "i")))
  
End 


Public Sub t_Timer()
 
  Dim s As String

  s = FMain.NomeClient()
  t.Stop()
  Raise Messaggi("Ho ritornato il valore al mio padrone.")
  DBus[s]["/dbusrisp"].Risposta("Risultato", $iOp, $iV1, $iV2, $fRisult)
  Raise Messaggi("E lui ha confermato.")
  
  Catch
    Message.Error("Evidentemente il mio padrone è assente... ")
  
End


Note

[1] I seguenti codici sono stati scritti dal membro milio del forum gambas-it.org, e revisionati, per essere adattati ai recenti aggiornamenti del Componente DBus, dal membro Gianluigi.