# Ruby-GTK

**URL:** <https://www.ruby-forum.com/t/ruby-gtk/175356>\
**Category:** IT\
**Created:** [September 11, 2009, 7:27pm UTC](https://www.ruby-forum.com/t/ruby-gtk/175356 "2009-09-11T19:27:36Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Davide\_Monfrecola](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/f08c70/32.png) [@Davide\_Monfrecola](https://www.ruby-forum.com/u/Davide_Monfrecola)\
**Post date:** [September 11, 2009, 7:27pm UTC](https://www.ruby-forum.com/t/ruby-gtk/175356/1 "2009-09-11T19:27:36Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Davide\_Monfrecola](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/f08c70/32.png) [@Davide\_Monfrecola](https://www.ruby-forum.com/u/Davide_Monfrecola)\
**Post date:** [September 11, 2009, 7:57pm UTC](https://www.ruby-forum.com/t/ruby-gtk/175356/2 "2009-09-11T19:57:28Z")

</div>

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](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 🙂 sarà sicuramente una cosa con  
cui prima o poi mi scontro.

* * *

Andrea D.

> **[using (IMHO)](https://andreadallera.wordpress.com)**

-----Messaggio originale-----  
Da: removed\_email\_address@domain.invalid [[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)]  
Per conto di Davide Monfrecola  
Inviato: venerdì 11 settembre 2009 17.27  
A: removed\_email\_address@domain.invalid  
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

---

<div class="post-metadata">

**Author:** ![Davide\_Monfrecola](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/f08c70/32.png) [@Davide\_Monfrecola](https://www.ruby-forum.com/u/Davide_Monfrecola)\
**Post date:** [September 12, 2009, 12:41pm UTC](https://www.ruby-forum.com/t/ruby-gtk/175356/3 "2009-09-12T12:41:15Z")

</div>

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](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 🙂 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

---

<div class="post-metadata">

**Author:** ![Davide\_Monfrecola](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/f08c70/32.png) [@Davide\_Monfrecola](https://www.ruby-forum.com/u/Davide_Monfrecola)\
**Post date:** [September 12, 2009, 7:50pm UTC](https://www.ruby-forum.com/t/ruby-gtk/175356/4 "2009-09-12T19:50:14Z")

</div>

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

* * *

Andrea D.

> **[using (IMHO)](https://andreadallera.wordpress.com)**

-----Messaggio originale-----  
Da: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) [[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)]  
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](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 🙂 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

---

<div class="post-metadata">

**Author:** ![Davide\_Monfrecola](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/f08c70/32.png) [@Davide\_Monfrecola](https://www.ruby-forum.com/u/Davide_Monfrecola)\
**Post date:** [September 13, 2009, 2:34pm UTC](https://www.ruby-forum.com/t/ruby-gtk/175356/5 "2009-09-13T14:34:34Z")

</div>

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

> Keep it simple FTW! 🙂 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(). 🙂  
Quali problemi posso avere se richiamo main\_iteration?
