Re: [python-brasil] GTK e threads

4 views
Skip to first unread message

Bruno Menegola

unread,
May 3, 2008, 1:21:39 PM5/3/08
to python...@yahoogrupos.com.br
Em 02/05/08, Lauro Moura <lauro...@gmail.com> escreveu:
> Bruno, você teria um código de exemplo? Rodei o programa do cara aqui
> e o programa funcionou (pelo menos mostrou o diálogo e não travou).

Ok, desculpe, apenas li o código do cara e não testei ele :P

Tentei reproduzir o meu problema em um programa simples. Escrevi três
versões bastante semelhantes e postei em [1, 2, 3]. Na versão [1] uso
o método gobject.idle_add() que faz com que o diálogo apareça mas
trave quando o usuário clica em ok. Na versão [2] apenas chamo a
função que cria o diálogo, o Xlib reclama que existe outra
thread/processo tentando desenhar na tela e o programa trava. Na
última versão [3] (consegui fazer funcionar baseado no código do cara
ali do post que citei no email anterior), ao invés de usar o idle_add
e o método gtk.MessageDialog.run() uso o método
gtk.MessageDialog.show_all() e crio uma função para tratar a resposta
do diálogo. A última versão soluciona meu problema, sim, mas é uma mão
a mais ficar criando uma nova função para cada diálogo para tratar dos
response_id que eram retornados pelo método run. Por que usando o run
não funciona? O que o run faz por baixo dos panos que bagunça tudo?
Tem como solucionar isso?

Obrigado,

Bruno.


programa travando:
[1] http://pastebin.com/m2fe27565

Xlib reclamando:
[2] http://pastebin.com/m38228696

funcionando:
[3] http://pastebin.com/m56acab9e

------------------------------------

,-----------------------------------------------------------.
| Antes de enviar um e-mail para o grupo leia: |
| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar |
| E se você é usuário do BOL lembre-se de cadastrar o |
| e-mail do grupo na lista branca do seu sistema anti-spam. |
`-----------------------------------------------------------´Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/python-brasil/

<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html


Kao Cardoso Felix

unread,
May 4, 2008, 2:29:30 PM5/4/08
to python...@yahoogrupos.com.br
2008/5/3 Bruno Menegola <mene...@gmail.com>:

> Na versão [2] apenas chamo a
> função que cria o diálogo, o Xlib reclama que existe outra
> thread/processo tentando desenhar na tela e o programa trava.

Bruno,

eu já tive esse problema da Xlib reclamar com esse tipo de coisa e a
solução era, cada vez que eu chamasse funções da gtk *fora* de um
callback do meu programa eu precisava colocar meu bloco de código
entre chamadas gtk.gdk.threads_enter() e gtk.gdk.threads_leave().
Por exemplo:

def atualiza_buffer(text_buffer, texto):
gtk.gdk.threads_enter()
text_buffer.insert(text_buffer.get_end_iter(), texto)
gtk.gdk.threads_leave()

A minha chamada para o gtk.main() também precisou dessas chamadas em volta:

gtk.gdk.threads_enter()
gtk.main()
gtk.gdk.threads_leave()

Eu não tenho como testar o código aqui, mas existe uma chance disso
solucionar o problema:

def test_thread():
print 'thread start'
time.sleep(3)
gtk.gdk.threads_enter()
show_dialog('thread end')
gtk.gdk.threads_leave()
print 'thread end'

--
Kao Cardoso Félix

Página pessoal: http://www.inf.ufrgs.br/~kcfelix
Blog: http://kaofelix.blogspot.com

Bruno Menegola

unread,
May 8, 2008, 5:10:53 PM5/8/08
to python...@yahoogrupos.com.br
2008/5/4 Kao Cardoso Felix <kcf...@gmail.com>:

> eu já tive esse problema da Xlib reclamar com esse tipo de coisa e a
> solução era, cada vez que eu chamasse funções da gtk *fora* de um
> callback do meu programa eu precisava colocar meu bloco de código
> entre chamadas gtk.gdk.threads_enter() e gtk.gdk.threads_leave().

É verdade, funcionou. Obrigado pela ajuda. Uma pena não ser possível
lidar com threads sem se preocupar com esses detalhes.

Abraço,

--
Bruno Menegola

Reply all
Reply to author
Forward
0 new messages