2012-04-30 3 views
3

파이썬 직렬 포트 리스너 응용 프로그램을 만들려고합니다.Python에서 백그라운드 루프 실행

내 문제는 백그라운드에서 GUI를 죽이지 않고 리스너 기능을 실행하고 있습니다.

import sys 
import getopt 
import serial 
from time import sleep 
from threading import * 
from Tkinter import * 
import io 
#ser = serial.serial_for_url('loop://', timeout=1) 
#sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser)) 

runing = True 
ser = None 
class App: 
    global ser 
    def __init__(self, master): 
    varCOM = StringVar(master) 
    varCOM.set("COM1") 
    listbox = OptionMenu(master, varCOM, "COM1", "COM2", "COM3", "COM4") 
    listbox.grid(row=0, column=0) 

    varBaudRate = StringVar(master) 
    varBaudRate.set(4800) 
    listboxBaudrate = OptionMenu(master, varBaudRate, 300, 1200, 2400, 4800, 9600, 14400, 19200, 38400) 
    listboxBaudrate.grid(row=0, column=1) 

    varParity = StringVar(master) 
    varParity.set("None") 
    listboxParity = OptionMenu(master, varParity, "None", "Even", "ODD", "Mark", "Space") 
    listboxParity.grid(row=1, column=0) 

    varDataBits = StringVar(master) 
    varDataBits.set(8) 
    listboxDataBits = OptionMenu(master, varDataBits, 5, 6, 7, 8) 
    listboxDataBits.grid(row=1, column=1) 

    varStopBits = StringVar(master) 
    varStopBits.set(2) 
    listboxStopBits = OptionMenu(master, varStopBits, 1, 2) 
    listboxStopBits.grid(row=2, column=0) 

    def detener(): 
    global runing 
    runing = False 
    detencion = Thread(target=detener) 

    def detencionRun(): 
    detencion.run() 

    def write(): 
    while runing == True: 
     #sleep(10) 
     line = ser.read(14) 
     if line: 
     print line 
     file.write(line) 
    itinerancia = Thread(target=write) 

    def openPort(port='COM1', baudrate=1920, bytesize=8, parity='N', stopbits=1): 
    try: 
     global ser 
     global file 
     port = varCOM.get() 
     baudrate = int(varBaudRate.get()) 
     bytesize = int(varDataBits.get()) 
     stopbits = int(varStopBits.get()) 
     ser = serial.Serial(port=port, baudrate=baudrate, bytesize=bytesize, parity=parity, stopbits=stopbits) 
     file = open("lecture.txt", "a") 
     file.write("-- INICIO PROGRAMA --\n") 

     itinerancia.run() 
     #while runing == True: 
     # line = ser.read(14) 
     # if line: 
     # print line 
     # file.write(line) 
     file.write("\n-- FIN DEL PROGRAMA --\n") 
     file.close() 
    except serial.SerialException: 
     print 'No se pudo abrir el puerto' 
    return 

    def ejecutar(): 
    detener = Button(master, text="Detener", command=detencionRun) 
    detener.grid(row=3, column=0) 

    t = Thread(target=openPort) 
    t.run() 

    ejecutar = Button(master, text="Ejecutar", command=ejecutar) 
    ejecutar.grid(row=3, column=1) 


if __name__ == '__main__': 
    root = Tk() 
    app = App(root) 
    root.mainloop() 

애플리케이션은 while 루프의 정지 :

여기 코드이다. The app freezed 내 나쁜 영어 죄송 및 코딩 (I 파이썬에 새로 온 사람)

답변

0

할 수 있습니다 중 앱을 멀티 스레딩과 다른 스레드에서 폴링 및 파일 쓰기를 넣어 시도하거나 포트 읽기 밖으로 나누기 시도 할 수 있으며, 파일은 더 큰 프로그램 루프 내부의 작은 청크에 기록되므로 많은 양의 데이터를 처리하더라도 프로그램 실행이 완전히 차단되지는 않습니다. 만약 당신이 그것을 처리하려고한다면, 당신은 아마도 쓰기와 처리가 완료되기 전에 우연히 메모리에있는 데이터를 덤프하거나 덮어 쓰지 않도록 읽기/쓰기 버퍼로 설정하기를 원할 것입니다 그것.