스레드는 GUI 이벤트에서만 작동합니다 - pygtk

스레드는 GUI 이벤트에서만 작동합니다 - pygtk

저는 빠르게 사용하여 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 비동기 메서드를 활용하기 위해 애플리케이션을 다시 작성할 수 있는지 여부입니다.

스레드가 있어야 한다고 주장하는 경우 다음 두 가지 규칙을 염두에 두십시오.

  1. 코드에서 가능한 한 빨리 GLib.treads_init()를 호출하세요.
  2. 스레드에서 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

관련 정보