|
|
Up |
|
|
  |
Date: May 1, 2008 13:43
Ciao,
Sto sviluppando una piccola applicazione desktop basata su wxPython 2.8,
SQLAlchemy 0.4.3 e python 2.5 che si occuperà principalmente di
raccogliere ordini (cibarie) dei clienti per poi servirli più
agevolmente. Lato db uso postgresql 8.2.
Ci saranno diverse installazioni di questa applicazione ma ognuna di
essere avrà a che fare con la stessa istanza di postgresql.
Mi è stato chiesto di inserire un textfield in cui viene visualizzato il
totale degli ordini finora salvati su db. Quello che mi piacerebbe è
fare in modo che all'aggiunta di un ordine, a tutte e tre le
applicazioni venisse notificato questo evento e provvedessero ad
aggiornarsi la textfield col totale corretto.
Non sono un grande esperto ma so che postgresql ha una sua gestione di
questo tipo di notifica con LISTEN e NOTIFY. Ho provato a fare un
piccolo test che pare funzionare ma volevo mostrarvi il modo in cui l'ho
realizzato per avere consigli su una migliore "architettura" della
soluzione.
Quando l'applicazione parte, all'interno del wx.Frame che ha questa
textfield che mi interessa tenere aggiornato faccio questa chiamata:
|
| Show full article (3.15Kb) |
|
| | 6 Comments |
|
  |
Author: Y3sY3s Date: May 1, 2008 14:38
Il Thu, 01 May 2008 22:43:17 +0200, none ha scritto:
> thread.start_new_thread(database.thread_notifica_ordini,
> (self.aggiorna_totale_complessivo,))
>
> uso i thread perchè altrimenti la schermata mi si blocca al momento
> dell'avvio dell'applicazione. Al thread passo la funzione
> "aggiorna_totale_complessivo" che appunto, aggiorna il totale sul
> componente grafico.
>
Cioe', ad esempio, da aggiorna_totale_complessivo chiami metodi sui widget
grafici? Se e' cosi', e' errato. Non puoi chiamare metodi su oggetti
grafici di un altro thread. O meglio, puoi, ma quel che succede e'
imprevedibile. O usi una queue oppure (metodo preferibile) scateni dal tuo
thread secondario un evento che verra' intercettato dal main thread. Ci
sono molti esempi di entrambe le cose in rete.
|
| Show full article (2.05Kb) |
|
| | no comments |
|
  |
Author: Emanuele GesuatoEmanuele Gesuato Date: May 2, 2008 01:09
On 1 Mag, 23:38, Y3s katamail.com> wrote:
> Cioe', ad esempio, da aggiorna_totale_complessivo chiami metodi sui widget
> grafici? Se e' cosi', e' errato. Non puoi chiamare metodi su oggetti
> grafici di un altro thread. O meglio, puoi, ma quel che succede e'
> imprevedibile. O usi una queue oppure (metodo preferibile) scateni dal tuo
> thread secondario un evento che verra' intercettato dal main thread. Ci
> sono molti esempi di entrambe le cose in rete.
La tua osservazione è giusta. Sto cercando di aggiornare dei
componenti grafici
su un thread secondario. Grazie dei consigli, penso che opterò per la
seconda soluzione
che mi pare più corretta.
|
| Show full article (1.55Kb) |
| no comments |
|
  |
Author: Giovanni BajoGiovanni Bajo Date: May 2, 2008 03:14
On Thu, 01 May 2008 21:38:52 +0000, Y3s wrote:
> Il Thu, 01 May 2008 22:43:17 +0200, none ha scritto:
>
>
>
>> thread.start_new_thread(database.thread_notifica_ordini,
>> (self.aggiorna_totale_complessivo,))
>>
>> uso i thread perchè altrimenti...
|
| Show full article (2.68Kb) |
| no comments |
|
  |
Author: Y3sY3s Date: May 3, 2008 03:38
Il Fri, 02 May 2008 01:09:08 -0700, Emanuele Gesuato ha scritto:
> On 1 Mag, 23:38, Y3s katamail.com> wrote:
>> Cioe', ad esempio, da aggiorna_totale_complessivo chiami metodi sui
>> widget grafici? Se e' cosi', e' errato. Non puoi chiamare metodi su
>> oggetti grafici di un altro thread. O meglio, puoi, ma quel che succede
>> e' imprevedibile. O usi una queue oppure (metodo preferibile) scateni
>> dal tuo thread secondario un evento che verra' intercettato dal main
>> thread. Ci sono molti esempi di entrambe le cose in rete.
>
> La tua osservazione è giusta. Sto cercando di aggiornare dei componenti
> grafici
> su un thread secondario. Grazie dei consigli, penso che opterò per la
> seconda soluzione
> che mi pare più corretta.
>
E' piu' pulita, e non e' tanto complessa come soluzione...poi e' molto
flessibile e immagino che sia un po' piu' peformante di fare polling su
una queue
|
| Show full article (1.71Kb) |
| no comments |
|
  |
Author: Manlio PerilloManlio Perillo Date: May 3, 2008 04:05
Il Fri, 02 May 2008 01:09:08 -0700, Emanuele Gesuato ha scritto:
> [...]
> In questa riga:
> if select.select([curs],[],[],50)==([],[],[]):
>
> E' impostato un timeout di 50 secondi, scaduto il quale il listener non
> intercetta più i miei notify.
> Vorrei semplicemente fare in modo il listener resti sempre attivo finchè
> l'applicazione non viene chiusa. Come posso fare ?
>
|
| |
| no comments |
|
  |
|
|
  |
Author: Emanuele GesuatoEmanuele Gesuato Date: May 5, 2008 04:32
On 3 Mag, 12:38, Y3s katamail.com> wrote:
>> La tua osservazione è giusta. Sto cercando di aggiornare dei componenti
>> grafici
>> su un thread secondario. Grazie dei consigli, penso che opterò per la
>> seconda soluzione
>> che mi pare più corretta.
>
> E' piu' pulita, e non e' tanto complessa come soluzione...poi e' molto
> flessibile e immagino che sia un po' piu' peformante di fare polling su
> una queue
>
Visto che uso wxPython ho provato a vedere se esiste qualcosa che fa
al caso mio e ho scoperto
la funzione wx.CallFunction che fa egregiamente il suo dovere.
grazie ancora :)
|
| |
| no comments |
|
|