2017-11-16 55 views
0

내가 (등, 열림/닫힘 밸브), 데이터를 수집하여이를 처리, 그것을 표시하는 응용 프로그램을 만들려고 노력하고, 일부 작동하고있어PyQt5 : 타이머 스레드에서

문제 설명. 더 엄격한 시간 제약이있는 미래의 애플리케이션을위한 실습으로 데이터 캡처 및 처리를 별도의 스레드에서 실행하려고합니다.

현재 문제는 다른 스레드에서 타이머를 시작할 수 없다는 것입니다.

현재 코드 진행

import sys 
import PyQt5 
from PyQt5.QtWidgets import * 
from PyQt5.QtCore import QThread, pyqtSignal 

# This is our window from QtCreator 
import mainwindow_auto 

#thread to capture the process data 
class DataCaptureThread(QThread): 
    def collectProcessData(): 
     print ("Collecting Process Data") 
    #declaring the timer 
    dataCollectionTimer = PyQt5.QtCore.QTimer() 
    dataCollectionTimer.timeout.connect(collectProcessData) 
    def __init__(self): 
     QThread.__init__(self) 

    def run(self): 
     self.dataCollectionTimer.start(1000); 

class MainWindow(QMainWindow, mainwindow_auto.Ui_MainWindow): 
    def __init__(self): 
     super(self.__class__, self).__init__() 
     self.setupUi(self) # gets defined in the UI file 
     self.btnStart.clicked.connect(self.pressedStartBtn) 
     self.btnStop.clicked.connect(self.pressedStopBtn) 

    def pressedStartBtn(self): 
     self.lblAction.setText("STARTED") 
     self.dataCollectionThread = DataCaptureThread() 
     self.dataCollectionThread.start() 
    def pressedStopBtn(self): 
     self.lblAction.setText("STOPPED") 
     self.dataCollectionThread.terminate() 


def main(): 
    # a new app instance 
    app = QApplication(sys.argv) 
    form = MainWindow() 
    form.show() 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    main() 

작업이 활용하는 방법에 대한 조언을 주시면 감사하겠습니다!

답변

1

QTimer를 DataCaptureThread 스레드로 이동해야하며 실행 방법이 끝날 때 스레드가 제거되므로 타이머가 제거되므로 다른 작업을 차단하지 않고 해당 기능을 실행하지 않아야합니다. QEventLoop은 다음 용도로 사용됩니다.

class DataCaptureThread(QThread): 
    def collectProcessData(self): 
     print ("Collecting Process Data") 

    def __init__(self, *args, **kwargs): 
     QThread.__init__(self, *args, **kwargs) 
     self.dataCollectionTimer = QTimer() 
     self.dataCollectionTimer.moveToThread(self) 
     self.dataCollectionTimer.timeout.connect(self.collectProcessData) 

    def run(self): 
     self.dataCollectionTimer.start(1000) 
     loop = QEventLoop() 
     loop.exec_() 
+0

고마워요! 이것은 'self.dataCollectionTimer.timeout.connect (self.collectProcessData)'를 'self.dataCollectionTimer.timeout.connect (lambda : self.collectProcessData)' 으로 수정하면됩니다. 그렇지 않으면 오류가 발생합니다 :'TypeError : collectProcessData()는 0 개의 위치 지정 인수를 취하지 만 1 개는 인수가 전달되지 않았기 때문에 실제로 이해하지 못합니다. – robotHamster

+0

@robotHamster 제대로 작동했다면 올바른 답으로 표시해 두는 것을 잊지 마십시오. – eyllanesc

+0

@ellyanesc 답에 람다를 추가해도 괜찮습니까? – robotHamster