python主线程休眠_python – time.sleep()需要保持QThread响应?

首先,我是Python的新手.我是MatLab的长期用户(工程师,而不是计算机科学家),我开始尝试将Python,NumPy,SciPy等工作到我的工作流程中.所以,请原谅我对这种精彩编程语言的明显无知!

作为我的第一次努力,我决定构建一个应用程序来与我正在开发的传感器进行交互.传感器具有微秒级分辨率(每500微秒512个高能量和512个低能量“像素”),但I / O将被阻塞.由于我将不断轮询设备,我知道线程对于保持GUI响应非常重要(GUI最终还会集成与其他设备的串行通信,并具有对传感器数据进行操作的图像处理子程序).我创建了一个MatPlotLib的线程实例来绘制来自传感器的这些“实时”数据.虽然我已经构建了独立与传感器通信的模块并验证了我知道如何在Python中实现这一点,但我从这里简单地通过生成512个8到12之间的随机数来实现数据的“模拟”以获得低能量对于高能量“像素”,“像素”和在90和110之间的512个随机数.那是线程化的.通过这里的许多例子,我还学会了使用blitting来使用MatPlotLib获得足够快的屏幕更新 – 但问题是,除非我使用time.sleep(0.02)使用线程进程休眠20ms,GUI没有反应.这可以验证,因为来自MatPlotLib的交互式X,Y数据点反馈不起作用,并且“STOP”按钮不能用于中断该过程.比time.sleep(0.02)更长的时间使GUI操作更加平滑,但代价是“数据速率”.任何比time.sleep(0.02)慢的东西都会使GUI无响应.我不确定我明白为什么.我本来打算尝试使用GUIqwt,但我想在放弃MatPlotLib之前会问这里,因为我不确定这是不是问题.我担心让线程休眠20ms将意味着我错过了来自传感器阵列的至少40个潜在数据线(40行* 500us /行= 20ms).

这是当前的代码:

import time, random, sys

from PyQt4.QtCore import *

from PyQt4.QtGui import *

from matplotlib.figure import Figure

from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas

class ApplicationWindow(QMainWindow):

def __init__(self, parent = None):

QMainWindow.__init__(self, parent)

self.thread = Worker()

self.create_main_frame()

self.create_status_bar()

self.connect(self.thread, SIGNAL("finished()"), self.update_UI)

self.connect(self.thread, SIGNAL("terminated()"), self.update_UI)

self.connect(self.startButton, SIGNAL("clicked()"), self.start_acquisition)

self.connect(self.stopButton, SIGNAL("clicked()"), self.stop_acquisition)

self.thread.pixel_list.connect(self.update_figure)

def create_main_frame(self):

self.main_frame = QWidget()

self.dpi = 100

self.width = 10

self.height = 8

self.fig = Figure(figsize=(self.width, self.height), dpi=self.dpi)

self.axes = self.fig.add_subplot(111)

self.axes.axis((0,512,0,120))

self.canvas = FigureCanvas(self.fig)

self.canvas.setParent(self.main_frame)

self.canvas.updateGeometry()

self.canvas.draw()

self.background = None

self.lE_line, = self.axes.plot(range(512), [0 for i in xrange(512)], animated=True)

self.hE_line, = self.axes.plot(range(512), [0 for i in xrange(512)], animated=True)

self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame)

self.startButton = QPushButton(self.tr("&Start"))

self.stopButton = QPushButton(self.tr("&Stop"))

layout = QGridLayout()

layout.addWidget(self.canvas, 0, 0)

layout.addWidget(self.mpl_toolbar, 1, 0)

layout.addWidget(self.startButton, 2, 0)

layout.addWidget(self.stopButton, 2, 1)

self.main_frame.setLayout(layout)

self.setCentralWidget(self.main_frame)

self.setWindowTitle(self.tr("XRTdev Interface"))

def create_status_bar(self):

self.status_text = QLabel("I am a status bar. I need a status to show!")

self.statusBar().addWidget(self.status_text, 1)

def start_acquisition(self):

self.thread.exiting = False

self.startButton.setEnabled(False)

self.stopButton.setEnabled(True)

self.thread.render()

def stop_acquisition(self):

self.thread.exiting = True

self.startButton.setEnabled(True)

self.stopButton.setEnabled(False)

self.cleanup_UI()

def update_figure(self, lE, hE):

if self.background == None:

self.background = self.canvas.copy_from_bbox(self.axes.bbox)

self.canvas.restore_region(self.background)

self.lE_line.set_ydata(lE)

self.hE_line.set_ydata(hE)

self.axes.draw_artist(self.lE_line)

self.axes.draw_artist(self.hE_line)

self.canvas.blit(self.axes.bbox)

def update_UI(self):

self.startButton.setEnabled(True)

self.stopButton.setEnabled(False)

self.cleanup_UI()

def cleanup_UI(self):

self.background = None

self.axes.clear()

self.canvas.draw()

class Worker(QThread):

pixel_list = pyqtSignal(list, list)

def __init__(self, parent = None):

QThread.__init__(self, parent)

self.exiting = False

def __del__(self):

self.exiting = True

self.wait()

def render(self):

self.start()

def run(self):

# simulate I/O

n = random.randrange(100,200)

while not self.exiting and n > 0:

lE = [random.randrange(5,16) for i in xrange(512)]

hE = [random.randrange(80,121) for i in xrange(512)]

self.pixel_list.emit(lE, hE)

time.sleep(0.02)

n -= 1

def main():

app = QApplication(sys.argv)

form = ApplicationWindow()

form.show()

app.exec_()

if __name__ == "__main__":

main()

也许我的问题甚至不是MatPlotLib或PyQT4,而是我实现线程的方式.正如我所说,我是新手,并且正在学习.而且,我甚至不确定GUIqwt会解决任何这些问题 – 但我知道我在这里看到很多建议使用比MatPlotLib更快的东西用于GUI中的“实时”绘图.感谢您的帮助!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值