我有一个PySide应用程序,它在QProcess
中生成一个worker应用程序。工作人员执行模拟并创建要由主应用程序读取的结果文件。我想生成工作者,给它工作时间,然后检查输出。在我的测试函数中(我使用py.test,如果有帮助),我找不到一种方法来等待工作者而不阻塞主线程,因此不允许工作进程启动和运行。
def test_worker_thread():
application = Application() # Waits for and loads result files
application.worker.start() # Runs in a new process
# How to wait right here without blocking thread?
<wait_code>
assert_correct_data(application.worker.results)
对于名为&#34; wait_code&#34;的部分,我尝试过:
使用一个名为done
的属性创建本地对象。我将worker.finished
信号连接到设置done
为True。然后我使用time.sleep
循环来阻止等待工作人员完成。
class WaitObject:
def __init__(self):
self.condition = False
def set_true(self):
self.condition = True
wait = WaitObject()
application.worker.finished(wait.set_true)
while not wait.condition:
time.sleep(1)
我搜索了测试异步Qt代码的方法,我遇到QTest.qWait
,我可以使用time.sleep()
代替qWait
而不阻止事件循环。但是,application
未包含在PySide中。
我也尝试过创建一个新的事件循环,就像在this thread中一样。但是,这似乎阻止了worker.start
的事件循环,因此我们无法在工作程序运行时完成loop = QtCore.QEventLoop()
application.worker.finished(loop.quit)
loop.exec_()
函数并加载数据。
{{1}}
任何提示?
答案 0 :(得分:1)
事实证明,选项3确实有效。由于无关的错误,我的工作人员没有启动。以下是一些完整的框架代码:
def test_worker_thread():
application = Application() # Waits for and loads result files
application.worker.start() # Runs in a new process
loop = QtGui.QEventLoop()
application.worker.finished(loop.quit) # Resume when worker done
loop.exec_() # Blocks at this line until loop quits
assert_correct_data(application.worker.results)
我将继续研究这种模式的抽象。我将使用连接到QTimer
的单一loop.quit
添加超时,以防从未调用worker.finished
。
编辑:这是blog post更详细解释。