2013-09-25 2 views
0

이제 약간의 비트가있는 작은 프로젝트로 거의 끝났습니다. 백그라운드 작업을 실행하고 GUI를 보여줍니다.백그라운드 작업과 GUI 실행

class myGUIApp: 
    def __init()__: 
     .... 
    def createwidgets(): 
     .... 

if __name__ == "__main__": 
    import myBackgroundTasks 
    x = myBackgroundTasks() 
    x.startbackground1() <----- this is background task that doesn't need user interaction 
    x.startbackground2() <----- this is background task that doesn't need user interaction 
    MainWindow = myGUIApp() 
    MainWindow.show() <---- this is Pyside GUI 

문제는 이것이다, GUI를 제 2 개 백그라운드 작업이 그들이 인터넷에서 I/O 작업과 그래버 파일을하고있는 것처럼 꽤 시간이 걸릴 수있는 완료되지 "쇼"가 나타날 때까지한다. 어떻게해야합니까? 파이썬의 멀티 쓰레드 사용하기 (백그라운드 작업에서 다중 쓰레드 사용)? Qthread? 또는 다중 처리 모듈? 또는 다른 사람? 대답 해줘서 고마워.

답변

1

thread에 넣을 수 있습니다. Qt gui가 자체 스레드에서 실행되기 때문에 이것은 효율적인 사용입니다. queue을 사용하여 x의 결과를 다시 전달하십시오. 유일한 트릭은 언제 어디서 언제 x이 필요합니까? gui 내부에 필요하다면 가장 좋은 방법은 gui의 메소드를 사용하는 것입니다. 핵심은 출력에 대한 대기열을 계속 확인하면서 모든 자원을 늘리지 않는 것입니다. gui 안에 while 루프를 넣으면 gui가 멈추는 원인이 될 것입니다.

from threading import Thread 
from Queue import Queue 

class myGUIApp: 
    def __init()__: 
     .... 
    def createwidgets(): 
     .... 

if __name__ == "__main__": 
    import myBackgroundTasks 
    QUEUE = Queue() 
    def queue_fun(q): 
     x = myBackgroundTasks() 
     x.startbackground1() <----- this is background task that doesn't need user interaction 
     x.startbackground2() <----- this is background task that doesn't need user interaction 
     q.put(x) 
    THREAD = Thread(target=queue_fun, args=QUEUE) 
    THREAD.start() 
    MainWindow = myGUIApp() 
    MainWindow.show() <---- this is Pyside GUI 

    # if you can wait until after mainloop terminates to get x, put this here 
    while THREAD.is_alive() 
     try: 
      x = QUEUE.get_nowait() 
     except Queue.Empty: 
      continue 
    # if you need this inside Pyside, then you should put this inside Pyside, 
    # but don't use while loop, use Qt after function and call self.wait 

    def wait(self): 
     try: 
      x = QUEUE.get_nowait() 
     except Queue.Empty: 
      self.after(5, self.wait) 
+0

답장을 보내 주셔서 감사합니다. 아니요, "x"가 GUI 안에있을 필요가 없습니다. 백그라운드 작업은 사용자 상호 작용이 필요없는 데이터베이스 정리 등입니다. 필요한 모든 사용자는 데이터베이스에서 정보를 검색하기 위해 일부 단추를 클릭해야했습니다. 그게 다야. – dorothy

+0

실이 당신을 위해 일 했습니까? x가 필요 없다면, 여러분은 큐를 필요로하지 않고, args없이 쓰레드를 시작하고, 큐를 사용하지 않고 스스로 죽이게 할 수 있습니다. –

+0

안녕하세요, 시도하지 않았습니다. 하지만 내 백그라운드 작업 코드에서 스레드를 사용했기 때문에 작동 할 것이라고 생각합니다. 나는 내가 여기서 무엇을해야하는지 알고 있다고 생각한다. 문제가 발생하면 게시 할 예정입니다. 다시 한번 고마워. – dorothy

관련 문제