파이썬 while 문제좀 해결해주세요
글쓴이: elfrog / 작성시간: 금, 2013/07/19 - 11:07오후
파이썬을 공부하면서 sdl을 모듈로 만들어보려고 하는데요,
sdl을 새로운 스레드에서 실행하게 하고 작업은 메인 스레드에서 하는 구조입니다.
이벤트가 발생하면 sdl 스레드에서 이벤트 클래스 메소드를 호출하게 되구요,
esc키가 눌리면 OnQuit메소드가 호출되고, running 변수를 False하여 loop메소드를 끝내게 하려는데
제대로 동작할때가 있고 동작하지 않을 때가 있네요~
코드좀 봐주시고 무엇이 문제인지 말씀좀 부탁드립니다.
import pysdl class SDLEvent: running = True def OnQuit(self): self.running = False print(self.running) def OnKeyDown(self, key): if key == "escape": pysdl.quit() def loop(self): while self.running: # 바로 여기에서 self.running이 False가 되도 while문이 끝날 생각을 안합니다. pass if __name__ == "__main__": try: pysdl.init(800, 600, 32) # 새 스레드로 sdl 창을 띄웁니다 e = SDLEvent() pysdl.setevent(e) # 이벤트 리스너를 등록한뒤 e.loop() # 파이썬 프로그램이 그냥 종료되지 않기 위해 OnQuit이벤트 발생까지 루프를 돌립니다 except Exception as e: print("error:", e.args[0])
Forums:
running이 false가 되는건 확인 하셨나요?
running이 false가 되는건 확인 하셨나요?
피할 수 있을때 즐겨라! http://melotopia.net/b
네, OnQuit이나 OnKeyDown에서
네, OnQuit이나 OnKeyDown에서 self.running=False하고 print(self.running)해서 확인해봤지만, while문은 꿈적도 안합니다. 대신, loop 메소드에서 아래처럼하면
언제 그랬냐는듯이 제대로 동작하더군요. (True True True True ... False)로 출력되면서 while문을 제대로 빠져나갑니다. 이와 같은 상황을 볼때 인터프리터 최적화 문제가 아닐까 싶기도 하구요. 스레드가 없을거라는 가정하에 최적화한거라면 인터프리터의 판단은 옳은거겠지만, 스레드가 동작하여 외부에서 변수가 변경되기라도 한다면 큰일인데 이런 최적화가 일어났을리는 설마... 있을까요?
그럼 pass가
그럼 pass가 문제겠네요
http://stackoverflow.com/questions/9483979/is-there-a-different-between-continue-and-pass-in-a-for-loop-in-python
이런 문제 아닐까요?
피할 수 있을때 즐겨라! http://melotopia.net/b
pass를 continue로 고쳐도 문제는
pass를 continue로 고쳐도 문제는 동일하네요.
변수의 id값을 출력해본 결과 loop메소드와 OnQuit메소드에서의 running 변수 id가 다르다는걸 알았지만 다른 이유를 지금 못찾고 있습니다. ㅠㅠ
똑같이 self.running으로 접근했음에도 전혀 다른 아이디의 변수에 접근하다니 혹시 인터프리터의 버그가 아닌가 싶기도 하구요.
파이썬을 극찬하는 사람들이 많아서 공부하려고 했더니 이런 사소한 문제로 버그가 있다면 믿고 쓸 수 있겠습니까 ㅠㅠ 아 도대체 문제가 뭘까요
try this: class SDLEvent:
try this:
class SDLEvent:
def __init__(self):
self.running = True
...
I suggest you to read some of Python tutorials.
답변 주신분들 모두 감사합니다. 파이썬에 문제가
답변 주신분들 모두 감사합니다.
파이썬에 문제가 있는게 아니라 저의 코딩 미숙으로 드러났네요.
스레드 락 해제하는 구간을 잘못잡아서 해제를 못하는 바람에 코드가 그냥 멈춘거였네요.
다음부턴 더 자세히 살펴보고, 이런 실수 안하도록 하겠습니다 ㅠㅠ
댓글 달기