2017-05-16 4 views
1

QThread를 사용하여 별도의 스레드에서 계산을하고 있습니다. 스레드가 버튼 클릭으로 시작되고 마녀가 StartMeasurement() 기능을 시작합니다. 스레드가 자체적으로 프로세스를 완료 할 수 있습니다 (계산 완료 후) 그리고 PyQT 신호가 완료되었습니다. 또는 stopBtn 클릭으로 사용자가 스레드를 중지 할 수 있습니다.GUI로 QThread 다시 시작

terminate() 함수가 작동하지만 스레드를 다시 시작하려고 할 때 많은 문제가 발생합니다.

여기서 movetoThread() 접근 방법을 사용하는 것이 좋습니다? 또는 올바르게 다시 시작하려면 스레드가 올바르게 중지되었는지 어떻게 확인할 수 있습니까? (수단, 새로운 시작!)

는 스레드의 measurment를 시작합니다 StartMeasurement()를

def StartMeasurement(self):    

    self.thread = measure.CMeasurementThread(self.osziObj, self.genObj, self.measSetup) 

    self.thread.newSample.connect(self.plotNewSample) 
    self.thread.finished.connect(self.Done) 
    self.stopBtn.clicked.connect(self.thread.terminate) 
    self.stopBtn.clicked.connect(self.Stop) 

    self.thread.start() 

답변

1

그것은 문제가되지 않습니다. QThread으로 작업 할 때는 moveToThread()을 통해 별도의 스레드로 이동 한 개체의 deleteLater() 슬롯에 finished() 신호를 연결하는 것이 일반적입니다. 스레드를 종료 할 때 메모리를 올바르게 관리하기 위해 스레드를 종료 한 다음 해당 인스턴스를 삭제할 것으로 가정하기 때문에 스레드를 삭제합니다. ;) 이것은 위에서 설명한 연결을 설정하지 않았다면 스레드를 중지하는 것이 해당 객체를 제거하는 것과 아무런 관련이 없음을 나타냅니다.

quit()wait()을 사용하여 올바르게 중지 한 경우 스레드를 다시 시작하는 것이 좋습니다. 중지가 완료 될 때까지 실제로 대기하십시오.

하지만, 내 조언은 추가 스레드가 어떤 이유로 응용 프로그램에 큰 영향을 미치지 않으면 (현대 기계에서는 거의 일어나지 않을 것입니다) 그렇게하지 않는 것이 좋습니다.

대신 스레드가 다음 옵션을 고려 다시 시작의 :

  • 그냥이 true로 설정되어 있으면 아무것도하지 않고 스레드 실행을 만드는 pause 플래그를 구현 (나는에 내 this 예를 여러 번 사용했습니다 가)
  • 사용 QRunnable C에있어 ++하지만이 시간에 PyQt에 이식 할 수 있습니다 - - 그런 행동을 보여 (특히 worker.cppdoWork() 기능을 확인) 그 다음 뭔가를 실행하도록 설계하고 (를하지 않는 한은 true) 스레드 풀로 돌아갑니다. 한 번씩 발생하는 작업이 있고 constatly running 별도의 스레드가 필요하지 않은 경우 정말 좋습니다. 당신이 QRunnable::run() 내부에서 수행 계산의 결과를 얻기 위해 신호와 슬롯 (사용하려는 경우)

내가 먼저 QObject에서 상속하고 QRunnable에서

  • 를 사용하여 선물합니다 (Qt Concurrent 모듈을 확인해야합니다 먼저 Qt가 제공하는 다양한 스레딩 기술에 대해 Example use cases을 읽어 보시기 바랍니다.