2013-08-02 169 views
0

我試圖在繪製傳入數據時同時控制步進電機的功能。我可以運行該功能,但是當我嘗試用鍵盤中斷停止時,線程無法識別它。停止/終止連續線程

下面是代碼:

   def forward(): 
       global delay 
       while True: 
       try: 
       cor = (-2.3*readadc(cor_adc)) + 1841 
       target = readadc(target_adc) 
       deltaP = target - cor 
       deltaP_list.append(deltaP) 
       if math.fabs((deltaP_list[-1] - deltaP_list[-2])) >= 10: 
        delay=(-.125628140704*math.fabs(deltaP)) + 30.1256281407 
       if delay < 5: 
        delay=5 
       print "delay", delay 
       print "diff", math.fabs((deltaP_list[-1] - deltaP_list[-2])) 
       print "Delta P", math.fabs(deltaP) 
       for i in range(0, int(50)): 
        setStep(1, 0, 0, 0) 
        time.sleep(int(delay)/1000.0) 
        setStep(1, 1, 0, 0) 
        time.sleep(int(delay)/1000.0) 
        setStep(0, 1, 0, 0) 
        time.sleep(int(delay)/1000.0) 
        setStep(0, 1, 1, 0) 
        time.sleep(int(delay)/1000.0) 
        setStep(0, 0, 1, 0) 
        time.sleep(int(delay)/1000.0) 
        setStep(0, 0, 1, 1) 
        time.sleep(int(delay)/1000.0) 
        setStep(0, 0, 0, 1) 
        time.sleep(int(delay)/1000.0) 
        setStep(1, 0, 0, 1) 
        time.sleep(int(delay)/1000.0) 
       except KeyboardInterrupt: 
        print('end') 
        break 
      Thread(target=forward).start() 
      xAchse=pylab.arange(0,50,1) 
      yAchse=pylab.array([0]*50) 
      fig = pylab.figure(1) 
      ax = fig.add_subplot(111) 
      ax.grid(True) 
      ax.set_title("Linear Algorithm") 
      ax.set_xlabel("Time") 
      ax.set_ylabel("mmHg") 
      ax.axis([0,50,0,300]) 
      line1=ax.plot(xAchse,yAchse,'-') 
      line2=ax.plot(xAchse,yAchse,'-') 
      manager = pylab.get_current_fig_manager() 

      def build_plot(arg): 
       cor = (-2.3*readadc(cor_adc)) + 1841 
       target = readadc(target_adc) 
       cor_list.append(cor) 
       target_list.append(target) 
      def RealtimePloter(arg): 
       CurrentXAxis=pylab.arange(0,50,1) 
       line1[0].set_data(CurrentXAxis,pylab.array(cor_list[-50:])) 
       line2[0].set_data(CurrentXAxis,pylab.array(target_list[-50:])) 
       ax.axis([CurrentXAxis.min(),CurrentXAxis.max(),0, 300]) 
       manager.canvas.draw() 
       #manager.show() 
      timer = fig.canvas.new_timer(interval=1) 
      timer.add_callback(RealtimePloter,()) 
      timer2 = fig.canvas.new_timer(interval=1) 
      timer2.add_callback(build_plot,())    
      timer.start() 
      timer2.start() 
      pylab.show() 
+1

您應該添加與您正在使用的語言對應的標籤。 – assylias

回答

0

沒有時間!

我相信你的線程實例不會聽interrupt的原因是因爲它超級忙,運行forward()方法!

試一試,看是否追加:

import time #somewhere in your code 
time.sleep(0) 

在你的方法結束時,會使螺紋聽! 「睡覺」零秒等同於檢查信號。

Read more about it