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

QThread와 main 스레드간의 통신 연결-5-

by 인터넷떠돌이 2020. 2. 6.
반응형

안녕하세요?

 

지난번 포스팅에서 제 의도와는 상당히 벗어난 결과가 나와서 통신은 어떻게 되기는 되는데, 정작 QThread에서 메인 스레드의 GUI 구성요소를 제대로 제어하지 못하는 현상이 발생했습니다. 그래서 이번에는 이런 상황을 타개하고자 어떻게 여러가지 시행착오를 거쳤고, 그 내용을 올리고자 합니다. 

 

먼저 이 작업을 위해서 QThread에서 Stop이라는 메서드를 따로 만들도록 합니다. 왜 이렇게 하느냐 하면, 그냥은 정지하라는 메서드가 없기 때문에, 일단 위 스크린샷처럼 self.terminate()란느 명령으로 강제로 종료를 시킬 수 밖에 없습니다.

 

그리고 나서 다음으로 해야 할일은 위 스크린샷에서 볼 수 있는 것과 같이, 일단 wait()이라는 명령어를 써서 QThread가 종료가 될 때까지 일단 기다리라고 말하는 수 밖에는 없습니다. 그리고 메서드가 종료되기를 기다린다는 join() 함수는 지원이 되지 않는 것을 확인할 수 있었습니다.

 

다음으로는 먼저 토탈 프로세스의 최대와 최소값을 지정하는 명령이 끝나고 나면, QThread를 종료하라는 명령을 내려 주도록 합니다.

 

그렇게 해서 위 스크린샷에서 볼 수 있는 것처럼 일단 필요하면 QThread를 실행시키고, for문으로 의도치 않게 진도가 나가거나 하는 부분이 있으면, 거기서는 wait()을 시켜 주는 방법을 사용했습니다.

 

그렇게 하고나서 서브 프로그레스 바도 한번 작업을 하도록 했습니다. 일단 이렇게 하는 것으로 다시금 QThread를 종료시킬 준비를 하도록 합니다.

 

 

그런데 제가 의도치 않은 결과가 나오는 것을 확인할 수 있었습니다. 우선 이렇게 했더니, 계속햇허 wait()을 하라고 그냥 전체적인 메인 스레드가 얼어버리는 현상이 발생한 것 입니다.

 

그래서 이 현상을 해결하기 위해서 일단 None을 선언하는 것으로 어떠한 object를 넣을 수 있는 완전히 빈 변수를 선언해 주도록 합니다.

 

그리고 나서 프로그레스 바를 각각의 변수에 집어넣는 과정을 거치도록 합니다. 이렇게 하는 것으로 일단 준비를 하나 마치도록 합니다.

 

다음으로는 QThread로 가서는 이제는 메인 스레드에서 조정을 하도록 하지 말고, QThread에서 직접 메인 스레드의 프로그레스 바를 조정하도록 설정을 합니다.

 

그리고 나서 위 스크린샷처럼 sleep()을 주는 것으로 일단 시간을 끌어 주도록 합니다. 이렇게 함으로써 잠시 QThread에서 처리가 진행이 될 때 까지 기다리라고 신호를 주는 것 입니다.

 

이렇게 했더니 일단은 제가 의도한 대로 움직이는 것을 확인할 수 있었습니다. 그런데 문제는 4등분이 되었다가 다시 합치는 과정에서 변수의 이름을 다시 조정하는 데 누락된 것이 있었습니다.

 

그리고 나서 서브 프로그래스 바의 경우에는 위 스크린샷에서 볼 수 있는 것처럼 QThread에서 직접 조정을 해 주도록 합니다.

 

이렇게 해서 속도가 다소 늦어지는 감이 있기는 있었습니다만, 그래도 어떻게 정상적으로 마치는 것은 성공했습니다. 이제 결과를 제대로 얻었는가 했는데.........

 

이렇게 해서 위 스크린샷에서 볼 수 있는 것처럼 결과는 제대로 얻어지는 것을 볼 수 있었습니다. 문제는 이제 이렇게 하고서도.......... 아직 프로그레스 바의 세세한 부분 - 현재값을 지정하는 것은 아직 되지 않았다는 것 입니다. 이 부분도 어떻게 해서 작업을 해서 그 내용을 올리도록 하겠습니다.

반응형