Thread funciona apenas em eventos gui - pygtk

2

Estou desenvolvendo um aplicativo multithread no pygtk usando rapidamente e preso com threads. Então, eu estou experimentando várias possibilidades e descobri que o meu thread funciona apenas quando eu faço algo no gui Aqui está o meu código

t = threading.Thread(target=self.calc,args=(treeiter))
t.daemon = True
t.start()

    def calc(self,treeiter):
        store=self.builder.get_object('liststore1')
        per=0
        while 1:
            print "Calcing and changing percent,per="+str(per)
            tore.set_value(treeiter,4,str(int(per))+"%")
            per+=1
            time.sleep(1)

Estou tentando atualizar o valor em liststore por thread, mas ele só é atualizado quando clico em algum botão ou em alguns outros eventos de gui, por que isso acontece? Por que o segmento não está sendo executado em segundo plano?

    
por Sreevisakh 31.03.2013 / 09:03

2 respostas

2

Usar time.sleep () não é uma boa ideia quando você está usando o gtk. Você poderia tentar usar um evento de timer. (Eu não uso mais rapidamente, mas isso deve funcionar, eu acho.)

from gi.repository import GLib

class Just_for_correct_coding():
    self.per = int()

    def start(self):
        GLib.timeout_add_seconds(1, self.calc)

    def calc(self,treeiter):
        store=self.builder.get_object('liststore1')
        print "Calcing and changing percent,per="+str(self.per)
        tore.set_value(treeiter,4,str(int(self.per))+"%")
        self.per+=1
        return True #important if you want to keep the timer running
    
por Thomas15v 31.03.2013 / 12:33
3

Tópicos e GTK nem sempre são bons juntos. Existem alguns truques que ajudam, mas não se surpreenda se tiver bugs estranhos. Recentemente, removi todos os threads de um aplicativo e me sinto muito melhor.

Então, a primeira coisa que você deve pensar é se você pode reescrever seu aplicativo para aproveitar os métodos assíncronos do GLib.

Se você insistir em ter tópicos, tenha essas duas regras em mente:

  1. Chame o GLib.treads_init () o mais cedo possível no seu código
  2. Ao chamar eventos GUI em um encadeamento, envolva-os em um GLib.idle_add ()

Estas são regras, não diretrizes. Você deve sempre fazer isso ao trabalhar com threads.

    
por Timo 31.03.2013 / 12:03