2016-08-24 7 views
0

내 응용 프로그램에서, 내가 백엔드와 통신 QThread 책임을 사용자 정의를 가지고 QTimer을 사용하고,() 메소드 실행에서 URL 및 데이터와 유틸리티 함수를 호출하는 데 실패 유틸리티 메소드 (들)에서, 나는 응답을 파싱하고, 궁극적으로 위의 스레드 변수 final_desired_content에 원하는 정보를 전달하면서, HTTP POST를 만들고있다. 내가 다시 정보를 전달하기 전에, 나는 반환하지 않으려 좀 더 많은 정보를 분석하고, 그리고 SomeClass 싱글 인스턴스에 저장하고 싶은 다음 BE 내에 연락 여러 스레드가있을 수 있기 때문에QThread가 제대로

def some_utility_method(...): 
    ... 
    return response_parsing(response) 

def response_parsing(response): 
    ... 
    some_file.SomeClass.instance().setNewData(otherData) 
    return mainParsedData 

이 성공적으로 한번 업데이트
class SomeClass(QtCore.QObject): 

    _instance = None 

    @classmethod 
    def instance(klass): 
    if not klass._instance: 
     klass._instance = SomeClass() 
    return klass._instance 

    def __init__(self): 
    QtCore.QObject.__init__(self) 
    self._recentlyUpdatedTimer = QtCore.QTimer() 
    self._recentlyUpdatedTimer.setSingleShot(True) 
    self._recentlyUpdatedTimer.timeout.connect(self._setOkToUpdateCB) 
    self._storedData = None 
    self._allowUpdate = True 

    def _setOkToUpdateCB(self): 
    self._allowUpdate = True 

    def setNewData(self, newData): 
    if self._allowUpdate: 
     print "UPDATING!" 
     self._allowUpdate = False 
     self._storedData = newData 
     self._recentlyUpdatedTimer.start(<some_time>) 
    else: 
     print "BLOCKED!" # ok to ignore newData 

문제가되는 : 전에 통과 한 데이터의 쓰기를 방지하고자하는 (특히 응용 프로그램 시작시) 몇 초 (우리는 무시 데이터가 버려진 것을 그것은 괜찮습니다) 두 번째 업데이트가 성공한 후에이 오류가 발생합니다. QObject :: startTimer : 다른 스레드에서 타이머를 시작할 수 없습니다.

스레드에 대해 알고 있고 읽은 것부터 QThread의 run()은 주 스레드에서 무슨 일이 일어 났는지 알지 못하는 또 다른 스레드입니다. 디버깅 중, 타이머가 singleShot으로 설정되어 있어도 타이머가 실행 중임이 나타납니다.

내가 어떤 제안 :

답변

0

내가 타이머를 사용하지 않음으로써이 문제를 해결을 주셔서 감사합니다. 내가하고 결국 무엇 했다 :

class SomeClass(QtCore.QObject): 
    ... 
    DATA_EXPIRE_THRESHOLD = 3 
    ... 
    def __init__(self): 
    ... 
    self._counter = 0 # Just for debugging 
    self._dataExpireTime = None 
    self._data = None 

    def setNewData(self, new_data): 
    self._counter += 1 
    if self._dataExpireTime is None or self._isExpired(): 
     print "self._isExpired(): [%s], counter: [%s]" % (self._isExpired(), self.counter) 
     self._data = new_data 
     self._dataExpireTime = time.time() + self.DATA_EXPIRE_THRESHOLD 

    def _isExpired(self): 
    return time.time() >= self._dataExpireTime 

세 개의 초 임계 값을 설정, 출력은 다음과 같습니다

self._isExpired(): [True], counter: [1] 
self._isExpired(): [True], counter: [2] 
self._isExpired(): [True], counter: [6] 
self._isExpired(): [True], counter: [15] 
self._isExpired(): [True], counter: [17] 
self._isExpired(): [True], counter: [18] 

내가 뮤텍스를 사용하려고했지만, 그것은 유사한 문제를했다 시간제 노동자. 나는 그런 문제를 다루는 데 대한 설명이나 조언을 고맙게 생각합니다.