Ruby-GTK

Ciao a tutti,
qualcuno di voi ha mai utilizzato le ruby-gtk?
Ho un problema con le progress bar.
Praticamente dovrei visualizzare cosa sta facendo il programma mediante
una label e una progress bar.
Per fare questo ad ogni punto del codice che coincide con una fase della
computazione, inserisco delle istruzioni come queste:

progressbar.fraction = 10.0/100.0
progressbar.text = “10% complete”

Il problema è che la GUI rimane in freeze per tutto il tempo che il
programma esegue le istruzioni (si tratta di parsing di pagine web e
ricerca di blocchi di parole simili). Quindi gli aggiornamenti
dell’interfaccia grafica non si vedono e tutto viene sbloccato solamente
quando il programma ha smesso di fare tutto. Quindi per farvi capire, mi
visualizza 100%.
Come posso fare?Ho già provato a gestire il tutto mettendo dei thread,
ma il problema rimane.
Ho provato a mettere un metodo (su un thread dedicato) che esegue un
ciclo ogni tot per vedere se il valore è cambiato, ma anche in questo
caso di blocca.
Come posso fare?E’ un problema di programmazione mio oppure è un
problema proprio del porting delle GTK per Ruby?

Grazie per l’attenzione

Ciao Davide,

uso ruby-gnome da un po’… purtroppo ha tante magagne ma bene o male
sono sempre riuscito a risolvere.
Devi assicurarti di aggiornare la GUI dal thread principale, ovvero
quello che viene creato dopo la chiamata a Gtk.main() . A dirla
è semplice, a farla un po’ meno soprattutto perché non puoi essere certo del
thread su cui sei quando chiami un metodo, anche se la chiamata arriva
da un evento di un wigdet. Qua →
http://ruby-gnome2.sourceforge.jp/hiki.cgi?tips_threads propongono una
soluzione (che viene presentata come rimedio ai segfaults che ti
arrivano a random se provi a chiamare metodi di interfaccia fuori dal
thread di gtk) che per mia esperienza risolve i problemi tipo il tuo.
Se non va facci sapere che mi interessa :slight_smile: sarà sicuramente una cosa con
cui prima o poi mi scontro.


Andrea D.

-----Messaggio originale-----
Da: [email protected] [mailto:[email protected]]
Per conto di Davide Monfrecola
Inviato: venerdì 11 settembre 2009 17.27
A: [email protected]
Oggetto: [ruby-it] Ruby-GTK

Ciao a tutti,
qualcuno di voi ha mai utilizzato le ruby-gtk?
Ho un problema con le progress bar.
Praticamente dovrei visualizzare cosa sta facendo il programma mediante
una label e una progress bar.
Per fare questo ad ogni punto del codice che coincide con una fase della
computazione, inserisco delle istruzioni come queste:

progressbar.fraction = 10.0/100.0
progressbar.text = “10% complete”

Il problema è che la GUI rimane in freeze per tutto il tempo che il
programma esegue le istruzioni (si tratta di parsing di pagine web e
ricerca di blocchi di parole simili). Quindi gli aggiornamenti
dell’interfaccia grafica non si vedono e tutto viene sbloccato solamente
quando il programma ha smesso di fare tutto. Quindi per farvi capire, mi
visualizza 100%.
Come posso fare?Ho già provato a gestire il tutto mettendo dei thread, ma
il problema rimane.
Ho provato a mettere un metodo (su un thread dedicato) che esegue un
ciclo ogni tot per vedere se il valore è cambiato, ma anche in questo caso
di blocca.
Come posso fare?E’ un problema di programmazione mio oppure è un problema
proprio del porting delle GTK per Ruby?

Grazie per l’attenzione

On Fri, 2009-09-11 at 19:57 +0200, Andrea D. wrote:

Ciao Davide,

uso ruby-gnome da un po’… purtroppo ha tante magagne ma bene o male sono sempre riuscito a risolvere.
Devi assicurarti di aggiornare la GUI dal thread principale, ovvero quello che viene creato dopo la chiamata a Gtk.main() . A dirla è semplice, a farla un po’ meno soprattutto perché non puoi essere certo del thread su cui sei quando chiami un metodo, anche se la chiamata arriva da un evento di un wigdet. Qua → http://ruby-gnome2.sourceforge.jp/hiki.cgi?tips_threads propongono una soluzione (che viene presentata come rimedio ai segfaults che ti arrivano a random se provi a chiamare metodi di interfaccia fuori dal thread di gtk) che per mia esperienza risolve i problemi tipo il tuo.
Se non va facci sapere che mi interessa :slight_smile: sarà sicuramente una cosa con cui prima o poi mi scontro.

Ciao Andrea,
la soluzione che mi hai passato mi sembra ottima e sicuramente fa al
caso mio. Però per adesso ho deciso di utilizzar un’altra soluzione, più
semplice ma anche meno “potente”, perchè la posso richiamare solo dal
main thread.
Ho dichiarato il seguente metodo:

def Gtkgui.process_gui_events
while Gtk::events_pending?
Gtk::main_iteration
end
end

e lo richiamo dal main thread ogni volta che faccio un aggiornamento
alla GUI. Sembra funzionare, ma penso che la soluzione con coda e
timeout sia migliore.
Grazie

Keep it simple FTW! :slight_smile: Occhio però che main_iteration è l’equivalente del
DoEvents() in VB6 se (per tua sfortuna) hai familiarità… ma se funziona
va benissimo!


Andrea D.

-----Messaggio originale-----
Da: [email protected] [mailto:[email protected]]
Per conto di Davide Monfrecola
Inviato: sabato 12 settembre 2009 10.00
A: ruby-it
Oggetto: Re: [ruby-it] R: Ruby-GTK

On Fri, 2009-09-11 at 19:57 +0200, Andrea D. wrote:

Ciao Davide,

uso ruby-gnome da un po’… purtroppo ha tante magagne ma bene o male sono sempre riuscito a risolvere.
Devi assicurarti di aggiornare la GUI dal thread principale, ovvero quello che viene creato dopo la chiamata a Gtk.main() . A dirla è semplice, a farla un po’ meno soprattutto perché non puoi essere certo del thread su cui sei quando chiami un metodo, anche se la chiamata arriva da un evento di un wigdet. Qua → http://ruby-gnome2.sourceforge.jp/hiki.cgi?tips_threads propongono una soluzione (che viene presentata come rimedio ai segfaults che ti arrivano a random se provi a chiamare metodi di interfaccia fuori dal thread di gtk) che per mia esperienza risolve i problemi tipo il tuo.
Se non va facci sapere che mi interessa :slight_smile: sarà sicuramente una cosa con cui prima o poi mi scontro.

Ciao Andrea,
la soluzione che mi hai passato mi sembra ottima e sicuramente fa al
caso mio. Però per adesso ho deciso di utilizzar un’altra soluzione,
più semplice ma anche meno “potente”, perchè la posso richiamare solo dal main
thread.
Ho dichiarato il seguente metodo:

def Gtkgui.process_gui_events
while Gtk::events_pending?
Gtk::main_iteration
end
end

e lo richiamo dal main thread ogni volta che faccio un aggiornamento
alla GUI. Sembra funzionare, ma penso che la soluzione con coda e
timeout sia migliore.
Grazie

On Sat, 2009-09-12 at 19:49 +0200, Andrea D. wrote:

Keep it simple FTW! :slight_smile: Occhio però che main_iteration è l’equivalente del DoEvents() in VB6 se (per tua sfortuna) hai familiarità … ma se funziona va benissimo!

Ho usato VB6, ma in modo molto basilare (scuola superiore) e non ho mai
usato il DoEvents(). :slight_smile:
Quali problemi posso avere se richiamo main_iteration?