본문 바로가기
무모한 도전-주식 인공지능 만들기

가장 힘들어 보이는 장애물을 넘기 위한 시도-7-

by 인터넷떠돌이 2019. 4. 17.
반응형

안녕하세요?

 

지난번 시간에는 무언가 예상치 않은 에러가 발생해서 알아보기 힘들게 하는 문제가 발생을 하였습니다. 그래서 이번 포스팅에서는 이 문제를 해결하기 위한 작업에 먼저 들어가 보아야 합니다만, 그전에 이 QProcess의 제대로 된 상태를 알아보기 위한 작업에 들어가 보기 위해서 몇몇 작업을 먼저 하고 나서, 이 다음에 어떻게 해서 지난 시간에 나온 is_alive()가 없다는 문제를 해결했는지 들어가 보고자 합니다.

 

먼저 위 스크린샷처럼 not 뒤에다가 메소드명을 붙여서 한번 시험에 들어가 보고자 했습니다. 물론 이 작업은 어디까지나 시도만 하는 것 입니다.

 

다음으로는 만약에 프로세스의 상태가 제대로 시작이 된 것이 아니라고 하면, QProcess가 제대로 시작을 할 때 까지 한번 while문을 계속해서 돌도록 디자인을 합니다.

 

그 결과는 일단 while문에 갇혀서 다른 것은 전혀 하지 않는 것을 확인할 수 있기는 있습니다. 그래서 이로 미루어 보아서, 분명히 자식 프로세스의 GUI는 뜨기는 떴는데, 왜 이런 현상이 벌어지는 것인지는 알수 없었습니다.

 

그래서 다음으로 코딩을 하기로는, 만약에 프로세스의 상태가 작동으로 바뀌었다면, 위 스크린샷과 같이 중간에 mainLoop001의 값이 바뀌고, 그에 따라 while루프를 탈출하도록 디자인을 했습니다.

 

그런데 뭐라고 해야 할까요? QProcess.stateChanged()함수는 이것만 가지고는 쓸 수 없다고 해서 에러가 뜨는 것을 확인할 수 있었습니다.

 

 

그래서 이런 경우에는 emit()함수를 사용해서 위 스크린샷5과 같은 방식으로 작동을 할 수 있도록 만들어서 다시금 움직여 보도록 합니다.

 

그런데 이렇게 하고서도, 어떻게 된 것인지 중간에 뭐가 바뀌는 것이 없이, 계속해서 while문에 갇혀서 무한 루프를 돌고 있는 것을 볼 수 있습니다.

 

그래서 생각한 것이, 이번에는 pid()함수를 사용해서, 만약 QProcess가 작동중이라고 하면, pid값이 변경될 것이기 때문에, 이를 가지고서 한번 작업을 하고자 합니다.

 

그런데 문제는 일단 pid값은 시작을 하기 전에는 None이라는 값을 반환하는 것을 볼 수 있습니다. 그래서 이 값을 과연 사용할 수 있는지는 의문이 듭니다.

 

그래서 잠시 QProcess의  상태를 체크할 수 있는 방법에 대해서는 잠깐 미루도록 하고, 이번에는 None type의 경우에 is_alive()속성이 없다는 에러를 해결하기 위해서, 먼저 threading에서 Thread를 import해 도록 합니다.

 

그 다음에는 위 스크린샷과 같이 초기화를 하는 함수에서 Thread()함수의 target=으로 지정하고자 하는 함수를 지정해 주도록 합니다.

 

그 다음으로는 위 스크린샷에서 볼 수 있듯이 원래는 is_alive()가 없던 곳에서 is_alive()를 붙여서 한번 제대로 작동을 할 수 있도록 만들어 주도록 합니다.

 

이렇게 하였더니, 어찌된 셈인지 실행이 되지 않고, 계속해서 위 스크린샷에서 보이는 화면만을 파이참이 내 보내면서 계속해서 정지되어 있는 것을 확인할 수 있었습니다.

 

알고 봤더니, ()하나를 붙여서 생긴 오류였습니다. 이렇게 메서드를 타겟으로 해서 Thread()함수를 사용할 경우에는 메서드명 뒤에 ()를 빼 주어야 합니다.

 

이렇게 해서 에러를 없앤 다음에 제대로 프로그램을 실행하는 것 까지는 가능한 것을 확인할 수 있기는 있었습니다. 다만, 이렇게 하였다고 해서, 본질적인 문제가 아직도 해결이 된 것은 아니기는 아닙니다. 저 역시 계속해서 인터넷을 이 잡듯이 뒤지고 있습니다만..... 뚜렷한 해법이 안 보입니다.

반응형