저는 빠르게 사용하여 pygtk에서 다중 스레드 응용 프로그램을 개발 중인데 스레드가 붙어 있습니다. 그래서 다양한 가능성을 실험하고 있는데 내 스레드가 GUI에서 작업을 수행할 때만 작동한다는 것을 알게 되었습니다. 여기 내 코드가 있습니다.
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)
by 스레드 의 값을 업데이트하려고 하는데 liststore
일부 버튼이나 다른 GUI 이벤트를 클릭할 때만 업데이트됩니다. 왜 그런가요? 스레드가 백그라운드에서 실행되지 않는 이유는 무엇입니까?
답변1
스레드와 GTK가 항상 잘 어울리는 것은 아닙니다. 도움이 되는 몇 가지 트릭이 있지만 이상한 버그가 있어도 놀라지 마십시오. 최근에 응용 프로그램에서 모든 스레드를 제거했는데 훨씬 나아졌습니다.
따라서 가장 먼저 생각해야 할 것은 GLib 비동기 메서드를 활용하기 위해 애플리케이션을 다시 작성할 수 있는지 여부입니다.
스레드가 있어야 한다고 주장하는 경우 다음 두 가지 규칙을 염두에 두십시오.
- 코드에서 가능한 한 빨리 GLib.treads_init()를 호출하세요.
- 스레드에서 GUI 이벤트를 호출할 때 이를 GLib.idle_add()로 래핑합니다.
이는 지침이 아니라 규칙입니다. 당신은해야합니다언제나스레드로 작업할 때 이렇게 하세요.
답변2
gtk를 사용할 때 time.sleep()을 사용하는 것은 좋은 생각이 아닙니다. 타이머 이벤트를 사용해 볼 수 있습니다. (나는 더 이상 빨리 사용하지 않지만 이것이 효과가 있다고 생각합니다.)
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