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

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

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

안녕하세요?

 

애초에 목적은 누누히 말하지만 GUI프리징을 막기 위한 작업이었지만, 그래도 이 작업을 하면서 의도치 않게 QThread와 메인 스레드간의 통신에 필요한 코딩하는 법을 알았습니다. 그래서 그 일련의 과정을 실험기록을 남기는 것을 겸해서 어떻게 만들고 있는데, 이래저래 이렇게 기록만 남기는 것이 아니라 슬슬 정리해야 할 핑요성을 느끼기도 합니다.

 

먼저 위 스크린샷의 강조가 된 부분처럼 QThread역할을 하는 클래스에 내용을 추가해 주도록 합니다. 이 내용에서 먼저 int가 들어간 신호를 먼서 선언을 하고, 그 다음에는 어떤 메서드가 실행이 되면, 이 메서드에서 변수를 담아서 - 단순히 신호를 보내서 off된 것을 on시키는 것만이 아니라 숫자를 첨부해서 보내서 얼마만큼 움직여라 하는 식으로 작업을 하는 가를 지정하는 작업을 해 주도록 합니다.

 

그리고 나서 다시 메인이 되는 클래스로 돌아와서, QThread에서 어떤 신호가 왔을 경우 메인 쓰레드에 있는 어떤 메서드로 연결이 될 것인가를 이렇게 __init__()에서 지정을 해 주는 것 입니다.

 

그리고 나서 다음으로 해야 할일은 우 ㅣ스크린샷에서 볼 수 있는 것처럼 신호를 주고, QThread에서 메인으로 total 프로세스바의 최대와 최소값을 지정하는 메서드가 실행된 다음 마커들이 차례대로 나오는 것인지를 한번 보도록 했습니다.

 

그리고 나서 다음으로 가장 중요한 메인 스레드 - GUI의 내용을 구성하고 있는 클래스에서 어떤 메서드가 이 프로그레스 바를 조정하는 메서드를 이렇게 하는 것 입니다.

 

 

그런데 상황은 제 의도와는 다르게 흘러가는 것을 볼 수 있었습니다. 분명이 저 두개의 마커는 mainprocessAddition이라는 문구보다 나중에 나와야 하는데, 그렇지 않은 것을 볼 수 있었습니다. 이러면 무엇이 문제냐 하면, 이 상황에서는 프로그래스 바의 최대와 최소값이 지정이 되지 않았는데 막 나가버리는 현상이 벌어지는 것 입니다.

 

그래서 이 작업을 어떻게 하였느냐 하면, 위 스크린샷에서 볼 수 있는 것처럼 아예 원래는 1개의 메서드에 있는 내용을 중간에 잘라 버렸습니다.

 

그리고 나서 total 프로그래스 바의 최소와 최대값이 지정된 다음에는, 위 스크린샷의 내용처럼 중간에 잘린 메인 스레드의 역할을 계속 이어가라는 식으로 바꾸어 보았습니다.

 

이렇게 하였더니, 일단 문제가 생기는 것이 어떻게 된게 제대로 무언가가 전달이 되지 않는 문제가 발생한 듯 합니다. 아무튼 한번 확인을 해 보았더니.......

 

바로 @가 붙은 데코레이터에 int를 빼먹어서 제대로 숫자를 전달받지 못해서 생기는 현상이었습니다. 이제 이걸 채워넣고 다시한번 시도를 해 봅니다.

 

그렇게 해서 제대로 제가 의도한 대로 실행이 되었는데, 또 다른 에러가 생겼습니다. 물론 이 에러는 그래도 상당히 쉬운-해결하기 간단한 에러이기는 했습니다.

 

그냥 중간에 하나였던 메서드가 2개로 짤리면서 생기는 현상이었는데, 이 부분에 대해서는 앞에다가 self.를 붙여서 메서드에서 메서드를 뛰어넘도록 만들면 간단하게 해결이 되었습니다.

 

그리고 나서 위 스크린샷에서 볼 수 있는 것처럼 가지가지로 self를 붙여주는 식으로 계속해서 메서드에서 다른 메서드로 변수가 전달이 될 수 있도록 만들어 줍니다.

 

그렇게 해서 어떻게 제대로 되었느냐 하면, 일단 제 의도대로 흘러가기는 가는 것을 확인할 수 있었습니다. 이렇게 해서 프로그래스 바 - 아랫쪽의 토탈 프로세스를 보여주는 프로그래스 바는 제대로 돌아가는 것을 확인이 가능했습니다. 이제 계속해서 작업을 마무리 하러 가야 합니다.

반응형