2009-11-25 1 views
6

나는 pygtk를 사용하여 프레임 워크로 프로그램을 작성하고 있습니다. 다음과 같은 일하고 주요 프로그램 :파이썬, 스레드 및 gobject

  1. 소켓
  2. 전화 gobject.Mainloop()

에서 데이터를 수신하는 클라이언트를 만들기 일부 자원

  • 을 모니터링하는 감시 스레드를 생성하지만 내 프로그램 이후 보인다 Mainloop을 입력하면 워치 독 쓰레드도 실행되지 않습니다.

    제 해결 방법은 gobject.timeout_add을 사용하여 모니터 작업을 실행하는 것입니다.

    하지만 왜 다른 스레드를 만들면 작동하지 않습니까?

    여기 내 코드입니다 :

    import gobject 
    import time 
    from threading import Thread 
    
    class MonitorThread(Thread): 
    
        def __init__(self): 
         Thread.__init__(self) 
    
        def run(self): 
         print "Watchdog running..." 
         time.sleep(10) 
    
    def main(): 
    
        mainloop = gobject.MainLoop(is_running=True) 
    
        def quit(): 
         mainloop.quit() 
    
        def sigterm_cb(): 
         gobject.idle_add(quit) 
    
    
        t = MonitorThread() 
        t.start() 
    
        print "Enter mainloop..." 
    
        while mainloop.is_running(): 
         try: 
          mainloop.run() 
         except KeyboardInterrupt: 
          quit() 
    
    if __name__ == '__main__': 
    
        main() 
    

    프로그램 출력 만 "감시 실행 ... 주회 돌이를 입력합니다 .."다음 아무것도. mainloop을 입력 한 후 스레드가 실행되지 않습니다.

  • +1

    더 무엇을 기대합니까? 위의 코드를 사용하면 두 가지가 각각 한 번씩 인쇄되기를 기대합니다. – u0b34a0f6ae

    답변

    9

    몇 가지 코드를 게시 할 수 있습니까? Global Interpreter Lock에 문제가있을 수 있습니다.

    Your problem solved by someone else :). 여기에 기사를 복사하여 붙여 넣을 수는 있지만 짧은 gtk의 c 스레드와 파이썬 스레드가 충돌합니다. gobject.threads_init()를 호출하고 모든 을 호출하여 c 스레드를 비활성화해야합니다. 일 수 있습니다.

    +0

    고마워, 내가이 코드와 함께 몇 가지 코드 스 니펫을 추가 할 수 있습니까? –

    +0

    알았어요. 정보 주셔서 감사합니다. –

    +2

    링크가 죽어서 답변에 짧은 힌트를 추가했기 때문에 기쁩니다. – vidstige

    2

    gtk에서 스레딩 기반 코드 경로를 초기화하지 못했습니다.

    가 가
    1. GTK 스레드 gtk.gdk.threads_init로 초기화해야합니다 : http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html에서

    , 저작권 완전히 유지 PyGTK와 사용하여 스레드 때 두 가지를 기억해야한다

    저자. 이 저작권 고지는 제거해서는 안됩니다.

    당신은 pygtk 대신 glib/gobject를 생각할 수 있습니다.

    +0

    고마워, 나는 GTK에서 새로운 것을 그만 둔다. 정보가 도움이됩니다. –