Estou desenvolvendo um aplicativo multithread em pygtk usando rapidamente e preso a threads. Então estou experimentando várias possibilidades e descobri que meu thread só funciona quando faço algo na GUI Aqui está 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 liststore
por thread, mas ele só é atualizado quando clico em algum botão ou em alguns outros eventos da GUI, por que isso acontece? por que o thread não está sendo executado em segundo plano?
Responder1
Threads e GTK nem sempre funcionam bem juntos. Existem alguns truques que ajudam, mas não se surpreenda se tiver bugs estranhos. Recentemente, removi todos os threads de um aplicativo e parece muito melhor.
Portanto, a primeira coisa que você deve pensar é se pode reescrever seu aplicativo para aproveitar as vantagens dos métodos assíncronos da GLib.
Se você insiste em ter tópicos, lembre-se destas duas regras:
- Chame GLib.treads_init() o mais cedo possível em seu código
- Ao chamar eventos GUI em um thread, envolva-os em GLib.idle_add()
Estas são regras, não diretrizes. Você devesemprefaça isso ao trabalhar com threads.
Responder2
Usar time.sleep() não é uma boa ideia quando você está usando gtk. Você poderia tentar usar um evento de timer. (Eu não uso mais rapidamente, mas acho que deve funcionar.)
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