【发布时间】:2017-01-01 03:52:29
【问题描述】:
在我的应用程序中,我有一个自定义 QThread 负责与后端通信,并使用来自 run() 方法的 url 和数据调用实用函数:
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 cannot be started from another thread
根据我对线程的了解和阅读,QThread 中的 run() 是另一个线程,它可能不知道主线程中发生了什么。 调试中,定时器似乎仍在运行,即使它设置为singleShot。
我将不胜感激任何建议:)
【问题讨论】:
标签: python pyqt pyqt5 qthread qtimer