2017-06-14 63 views
3

我有了2个非常简单的线程的程序:运行与matplotlib原因蟒蛇崩溃线程

  • 一个用于监听串口
  • 一个用于文本UI

我也有matplotlibanimation在我main()运行。它有一个scope类,它是从matplotlib的例子。

当程序开始运行,它显示的情节,一切都OK。问题是,只要用户输入密钥,程序崩溃,python就会退出,并带有致命错误。

ui线程与matplotlibscope类无关。如果我删除创建图的代码,ui线程没有问题,并且程序运行顺利。我也注意到matplotlib我的系统上使用tkinter创建窗口。

你有为什么matplotlibanimation导致问题的任何提示或经验?不能线程与matplotlibplot使用吗?

我在命令行窗口中Windows7Python 2.7运行此。

matplotlib版本:2.0.2 Tkinter版本:8.5

错误:

Fatal Python error: GC object already tracked 

This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 

或者这个错误:

TclStackFree: incorrect freePtr. Call out of sequence? 

This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 

代码:

import threading 
import serial 
from matplotlib.lines import Line2D 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

class listner(threading.Thread): 

     def __init__(self,port): 
      threading.Thread.__init__(self) 
      self.sport=None 
      self.is_running=True 
      self.init_port(port) 

     def run(self): 
      print ' Reading from Port' 
      while self.is_running: 
       try: 
        self.sport.read(1) 
       except: 
        print 'Error reading port' 

     def init_port(self,port): 
      print '1' 
      if self.sport==None or not self.sport.is_open : 
       try: 

        self.sport = serial.Serial(port,115200) 
        self.sport.timeout = 1 
        self.sport.reset_input_buffer() 
        self.sport.reset_output_buffer() 
        self.port_open=True 
       except: 
        print " Port error Listener Initing\n",self.port_open,'\n',self.sport 
      else: 
       pass 

     def process(self): 
      pass 


class ui(threading.Thread): 

     def __init__(self): 
      threading.Thread.__init__(self)  
      self.running = True 

     def run(self): 

      print 'Starting UI:\n' 
      while self.running: 
       print ' Enter input ''S'':\n' 
       user = raw_input() 



def main(port): 

     listner_thread = None 
     try: 
      listner_thread = listner(port) 
      listner_thread.start(); 
     except: 
      print "Listener Thread Failed To Start" 
      return 

     ui_thread=None 
     try: 
      ui_thread = ui() 
      ui_thread.start()   
     except: 
      print "UI Thread Failed To Start" 
      return 

     run_charts() 



def run_charts(): 
     fig, (ax1, ax2) = plt.subplots(2, 1) 

     scope1 = Scope(ax1) 
     ani1 = animation.FuncAnimation(fig, scope1.update, emit_ch1, interval=10,blit=True) 

     scope2 = Scope(ax2) 
     ani2 = animation.FuncAnimation(fig, scope2.update, emit_ch2, interval=10,blit=True) 

     plt.show() 

def emit_ch1(): 
    yield 0.001 

def emit_ch2(): 
    yield -0.001 

class Scope(object): 
     def __init__(self, ax, maxt=2, dt=0.02): 
      self.ax = ax 
      self.dt = dt 
      self.maxt = maxt 
      self.tdata = [0] 
      self.ydata = [0] 
      self.line = Line2D(self.tdata, self.ydata) 
      self.ax.add_line(self.line) 
      self.ax.set_ylim(-.009, 0.009) 
      self.ax.set_xlim(0, self.maxt) 

     def update(self, y): 
      t = self.tdata[-1] + self.dt 
      self.tdata.append(t) 
      self.ydata.append(y) 
      self.line.set_data(self.tdata, self.ydata) 
      return self.line, 



if __name__ == '__main__': 
     main('COM11') 
+0

这可能是人们更容易地调试这个,如果你提供的是仍然有这个问题更小例子。请参阅https:// stackoverflow。COM /帮助/ MCVE – timotree

+0

当我在Python把这个代码中,我得到的错误: 'AttributeError的:对象类型“听者”有listner'' 因为这行没有属性”: 'listner_thread = listner.listner(端口) ' 你确定你所提供的代码是工作,直到用户点击一个键的代码? – timotree

+0

我更新了代码。这是完全正常工作并重现问题。 –

回答

2

的第一个错误,“致命的Python错误:GC对象已跟踪”,2013年被关闭以“CLOSED WONTFIX”状态,查看Bugzilla的

看来,当它被再次提出的临时修订的bug report 2015年[关于DASK]是use a single thread使用此代码:

import dask 
    dask.set_options(get=dask.async.get_sync) 

,但这个问题实际上dataframe.read_csv问题所在。

问题是eventually solved在大熊猫的更高版本。如果您升级您的matplotlib版本,那么问题很可能也会通过类似的修复解决。

希望这有助于

+0

感谢您的信息。我猜'Tkinter'有些问题。我跑另一台机器上相同的代码,其使用了'MPL WebAgg' GUI框架和它运行平稳。它在浏览器中打开图形,但是这不是所期望的。 –

+1

导入pyplot之前避免窗洞@dandikain插入此行“matplotlib.use(” AGG的“)” - [来源](http://matplotlib.org/1.4.2/faq/howto_faq.html#howto-批次)还建议在show()之前保存图表,例如plt.savefig(“图”) –

+0

尝试,并把它一开始,但它并没有生效,并警告说,我应该把它叫前后情节!(这是我做的,我之前的一切说法。) –