문제

피그크 응용 프로그램을 스레드하는 데 몇 가지 문제가 있습니다. 문제가 있으면 작업을 완료 할 시간을 스레드에게 제공합니다. 어쨌든 계속하지만 사용자에게 경고합니다. 그러나 계속되면이 스레드는 gtk.main_quit가 호출 될 때까지 멈 춥니 다. 이것은 나를 혼란스럽게합니다.

관련 코드 :

class MTP_Connection(threading.Thread):
    def __init__(self, HOME_DIR, username):
        self.filename = HOME_DIR + "mtp-dump_" + username
        threading.Thread.__init__(self)

    def run(self):
        #test run
        for i in range(1, 10):
            time.sleep(1)
            print i   

..........................

start_time = time.time()
conn = MTP_Connection(self.HOME_DIR, self.username)
conn.start()
progress_bar = ProgressBar(self.tree.get_widget("progressbar"),
                           update_speed=100, pulse_mode=True)
while conn.isAlive():
    while gtk.events_pending():
        gtk.main_iteration()
    if time.time() - start_time > 5:
        self.write_info("problems closing connection.")
        break
#after this the program continues normally, but my conn thread stops
도움이 되었습니까?

해결책

첫째, 서브 클래스를하지 마십시오 threading.Thread, 사용 Thread(target=callable).start().

둘째, 아마도 당신의 명백한 블록의 원인은 gtk.main_iteration 매개 변수를 가져옵니다 block, 기본값 True, 그래서 당신의 전화 gtk.main_iteration 반복 할 이벤트가 없을 때 실제로 차단됩니다. 다음과 같이 해결할 수 있습니다.

gtk.main_iteration(block=False)

그러나 실제 GTK 메인 루프 대신 해킹 된 루프를 사용하는 이유는 실제 설명이 없습니다. 이미 메인 루프 안에서 이것을 실행하고 있다면, 나는 당신이 잘못된 일을하고 있다고 제안합니다. 좀 더 세부 사항 및/또는 완전한 예를 제공하면 귀하의 옵션을 확장 할 수 있습니다.

셋째, 이것은 나중에 나왔습니다 : 항상 항상 언제나 언제나 당신이 전화했는지 확인하십시오 gtk.gdk.threads_init 스레드가있는 Pygtk 응용 프로그램에서. GTK+는 스레드를 실행할 때 다른 코드 경로를 가지고 있으며이를 사용해야합니다.

나는 썼다 Pygtk 및 Threads에 관한 작은 기사 그것은 당신에게 작은 추상화를 제공하므로 이러한 것들에 대해 걱정할 필요가 없습니다. 해당 게시물에는 진행률 표시 줄 예제도 포함되어 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top