2013-05-18 3 views
1

빈티지 컴퓨터 시스템 용 에뮬레이터를 파이썬으로 작성하고 있는데, 멈출 때마다 에뮬레이터 코어 스레드를 "다시 시작"하려고 할 때 예외가 발생합니다. 조건. 내가, 내가 프로세서에 메모리 이미지를로드 주요 기능을 가지고있는 프로그램 카운터를 설정하고에 테스트 프로그램을 실행파이썬 스레딩 : 인터프리터 셧다운 예외

def run_processor(self): 
    processor = self 

    class processor_thread(threading.Thread): 
     def __init__(self): 
      threading.Thread.__init__(self) 
      self.daemon = True 

     def run(self): 
      while processor.running: 
       #main loop for instruction fetch and decode is here 

    self.processor_thread = processor_thread() 
    self.running = True 
    self.processor_thread.start() 

: "실행 프로세서"방법은 더 큰 클래스의 일부는 다음과 같이 보입니다 에뮬레이터. 그러면 콘솔에 결과가 출력되고 결국 프로세서의 "HLT"명령은 "processor.running"을 false로 설정하여 processor_thread를 종료합니다.

이 확인을 작동하지만이 문제에 실행하는거야 곳은 두 번째 run_processor 호출하여 프로세서를 다시 시작하는 테스트입니다 :

processor = Processor(memory, scheduler, interrupts, teleprinter) 
processor.program_counter = 128 
processor.run_processor() 
while processor.processor_thread.isAlive(): 
    pass 
processor.program_counter = 128 
processor.run_processor() 

첫 번째 인스턴스가 잘 실행을하지만, run_processor 방법은 경우 두 번째로 다음 오류가 발생했습니다.

Exception in thread Thread-3 (most likely raised during interpreter shutdown)

어떻게 수정할 수 있습니까? 감사.

편집 : 코드를 깨뜨린 후 실제로 제대로 작동하는 것으로 나타났습니다. 내 HALT 메소드가 실제로 모든 프린터 주변 장치 스레드를 종료하는 방식으로 작성되었음을 알지 못했습니다. ( 포함)은 텔레 프린터 에뮬레이터를 실행하는 스레드입니다. 텔레 프린터를 사용하지 않으면 두 번째 테스트에서 에뮬레이터 코어가 손상된 것처럼 보입니다.

import threading 
import time 

class Processor(object): 
    def __init__(self): 
     self.running = False 

    def halt_processor(self): 
     self.running = False 

    def run_processor(self): 
     processor = self 

     class processor_thread(threading.Thread): 
      def __init__(self): 
       threading.Thread.__init__(self) 
       self.daemon = True 

      def run(self): 
       while processor.running: 
        #main loop for instruction fetch and decode is here 
        print "Hello, I am the main loop doing my thing 1" 
        time.sleep(1) 
        print "Hello, I am the main loop doing my thing 2" 
        time.sleep(1) 
        print "I will halt now." 
        processor.halt_processor() 

     self.processor_thread = processor_thread() 
     self.running = True 
     self.processor_thread.start() 

def test1(): 
    processor = Processor() 
    processor.run_processor() 

def test2(): 
    processor = Processor() 
    processor.run_processor() 
    while processor.processor_thread.isAlive(): 
     pass 
    processor.run_processor() 

def main(): 
    test2() 

if __name__ == '__main__': 
    main() 

작품 OK :

다음은 테스트 케이스입니다.

+0

@Wessie하지만 첫 번째 스레드가 종료 된 후 "processor.run_processor()"를 두 번째 호출하는 동안 "self.processor_thread = processor_thread()"줄에 새 스레드를 만들지 못합니까? – Bitrex

+0

죄송합니다. 코드를 올바르게 읽지 못했습니다. 첫 번째 주석을 무시하십시오. – Wessie

답변

0

기본 스레드는 프로세서 스레드를 다시 시작한 직후에 끝납니다. 시작한 후에 while을 넣으려고 했습니까?

P.S. .: 또한 좋은 작업 코드를 사용하면 도움을주고 자하는 사람들을 위해 디버깅을 훨씬 쉽게 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 게시 된 문제를 보여주는 실행 가능한 프로그램을 얻으려고 노력할 것입니다. – Bitrex

2

먼저이 오류를 무시해도됩니다. 프로그램이 작동하면 종료 중 오류가 무시 될 수 있습니다. 나는 이것이 사물이되어야하고 깨끗한 해결책이 요구되는 방식이 아니라는 것을 당신과 완전히 함께합니다.

thread.join()에 대한 호출이 누락되었다고 생각합니다. 현재 스레드가 isAlive() (is_alive(), btw 여야 함)에서 거짓을 반환 할 때까지 대기 중입니다. join()을 사용하는 것이 더 빠르고 더 짧습니다.

BTW : Thread 클래스에서 파생 될 필요가 없으므로 코드가 조금 더 짧아집니다. 개인적으로 파이썬 객체는 스레드 자체가 아니라 스레드 자체의 핸들이기 때문에 더욱 명확합니다.

+0

감사합니다. 귀하의 제안도 시도해 보겠습니다. – Bitrex