[英]pygtk gui freezes with pyjack thread
我有一个程序,可通过Jack连接录制来自火线设备(FA-66)的音频。 该接口是使用pygtk创建的,而录制是使用py-jack( http://sourceforge.net/projects/py-jack/ )创建的。 录制是在另一个线程中完成的,因为必须同时使用GUI来查看音频结果。
问题是,当我启动记录线程时,GUI的响应速度非常慢。 我在主线程的开头有gtk.gdk函数start_threads()。 如果我做对了,我就不需要threads_enter()和threads_leave(),因为录制不会影响GUI。 如果我错了,请更正。
函数jack.process()记录来自三个麦克风的音频。 例如,如果我将其替换为time.sleep(2),一切正常。
在这种情况下,创建线程的最佳方法是什么? 为什么jack.process冻结GUI? 是否需要花费所有的CPU时间? 我的代码示例如下:
soundrecorder.py:
...
def start(self):
Thread(target=self._start).start()
def _start(self):
while self.eventhandler.record.isSet():
data = self._jackRecord(self.sample_length)
self.datahandler.queue.put(data)
def _jackRecord(self, length):
capture = Numeric.zeros((self.inputs, int(self.sample_rate * length)), 'f')
output = Numeric.zeros((self.inputs, self.buffer_size), 'f')
i = 0
while i < capture.shape[1] - self.buffer_size:
try:
jack.process(output, capture[:,i:i+self.buffer_size])
i += self.buffer_size
except:
pass
return capture
eventhandler.py:recordStart()和recordStop()只是在按下开始和停止按钮时调用的回调函数。
...
def recordStart(self, widget, data=None):
if not self.record.isSet():
self.record.set()
self.soundrecorder = SoundRecorder(self, self.datahandler)
self.soundrecorder.connect()
self.soundrecorder.start()
def recordStop(self, widget, data=None):
if self.record.isSet():
self.record.clear()
del(self.soundrecorder)
您会误解线程的工作方式。
在这种情况下,线程对您没有帮助。
“然后,当记录一个样本时,将对其进行分析并将结果显示在GUI中。同时,下一个样本也已经被记录。”
错误 。 线程不能同时做两件事。 在python中,有一个全局锁,可以防止两个线程同时运行python代码或触摸python对象。 除此之外,如果您没有两个CPU或内核,就不会同时发生两件事。 线程机制只是在它们之间切换,一次执行每个指令的固定数量。
帖子还添加了处理,存储和代码complexibility开销并无益处 。 与单线程相比,使用线程的Python代码运行速度较慢,并且性能较低 。 此规则只有少数例外,您的情况也不是其中之一。
您可能希望将记录循环重写为回调并将其与GTK循环集成(与使用线程相比,您将获得更好的性能)。
为此,请使用优先级gobject.idle_add
。
如果要使用两个处理器/内核“同时”真正运行两件事,则需要启动另一个进程。 启动一个进程来收集数据,并通过某种进程间通信机制将其传输到另一个正在分析和绘制数据的进程中。 多处理模块可以帮助您。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.