前提:
我创建了一个主窗口。其中一个下拉菜单有一个“ProcessData”项。当它被选中时,我会创建一个QProgressDialog。然后我在主循环中进行大量处理,并定期更新QProgressDialog中的标签和百分比。在
我的处理方式如下:从一个文件(numpymemmapped array)读取大量数据,进行一些信号处理,将输出写入一个普通的h5py文件。我迭代可用的输入文件,所有输出都存储在一个通用的h5pyhdf5文件中。整个过程大约需要两分钟,每个输入文件和引脚一个CPU到100%。在
目标:
如何使这个过程不阻塞,以便UI仍然响应?我仍然希望我的处理函数能够更新QProgressDialog及其相关的标签。在
我可以扩展这个功能来同时处理多个数据集,并保留更新progressbar信息的能力吗?在
我可以从多个线程/进程等写入h5py吗。?我必须对写操作执行锁定吗?在
软件版本:
我将python3.3+与numpy/scipy/etc一起使用,UI位于PyQt4 4.11/qt4.8中,不过我对使用python3.4(因此也是asyncio)或PyQt5的解决方案感兴趣。在
这是一个非常复杂的问题需要解决,而且这种格式并不适合为所有问题提供完整的答案。不过,我会尽力让你走上正轨。在
要使其不阻塞,需要将处理卸载到Python线程或
QThread
。更好的是,将它卸载到一个子进程中,通过主程序中的一个线程将进度反馈给主程序。在我将让您实现(或提出另一个问题)创建子流程或线程。但是,您需要知道只有主线程才能访问GUI方法。这意味着如果使用
QThread
或使用来自python线程的QApplication.postEvent()
,则需要发出一个信号(我已经将后者打包到python2.7here的库中)。Python3兼容性总有一天会到来)是的。一个例子是生成许多子流程。每个子进程都可以配置为向主进程中的关联线程发送消息,主进程通过为上述点描述的方法将进度信息传递给GUI。如何显示这些进度信息取决于您自己。在
不应该一次从多个线程写入hdf5文件。你需要实现锁定。我认为甚至连读访问都应该连载。在
我的一位同事已经为Python2.7编写了一些东西(请参见here和{a3}),如果您愿意,欢迎您查看它或分叉它。在
相关问题 更多 >
编程相关推荐