在我的应用程序中,我有一个自定义的QThread,负责与后端进行通信,并使用url和来自run()方法的数据调用一个实用函数:
class SomeThread(QtCore.QThread):
  def __init__(self, parent=None...):
    QtCore.QThread.__init__(self, parent)
    ...
  def run(self):
    final_desired_content = some_utility_method(url, data ...)
    # emitting success with final_desired_content在实用方法中,我创建了一个http POST,获得一个响应,解析响应,最后将所需的信息传递给上面的线程变量final_desired_content。在传递回信息之前,我正在解析一些我不想返回的更多信息,并希望将其存储在SomeClass单例实例中:
def some_utility_method( ... ):
  ...
  return response_parsing(response)
def response_parsing(response):
  ...
  some_file.SomeClass.instance().setNewData(otherData)
  return mainParsedData因为可能会有多个线程在几秒钟内(特别是在应用程序启动期间)联系be,所以我希望阻止在过去之前写入数据(我们忽略的数据被丢弃是正常的):
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: Timers不能从另一个线程启动
根据我对线程的了解和阅读,QThread中的run()是另一个线程,它可能不知道主线程中发生了什么。调试时,似乎计时器仍在运行,即使它被设置为singleShot。
如果有任何建议,我将不胜感激:)
发布于 2016-08-26 02:57:49
我通过不使用计时器解决了这个问题。我最终做的是:
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 因此,将阈值设置为3秒,输出为:
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]我试图使用互斥锁,但它与计时器有类似的问题。我仍然希望得到关于处理这些问题的解释或建议。
https://stackoverflow.com/questions/39133008
复制相似问题