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

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

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

안녕하세요?

 

지난번에는 정말 불만족 스러운 시작이 되었습니다만, 그래도 일단 시작은 시작이고, 이 작업을 하기 위해서는 계속해서 작업을 해야 합니다. 아무튼 이 예약포스팅을 작성하고 있는 시점인 2월 3일에는 허리 통증도 많이 나아져서 일상생활에는 무리가 없는데, 조금만 더 하면 완치가 될 것으로 보입니다. 아무튼 서론이 길어졌는데, 일단 작업을 하기 위해서 한번 움직여 보고자 합니다.

 

지난번의 작업이 그다지 만족스럽지가 않아서, 전부 지우거나 되 돌리기는 힘들기 때문에 하는 수 없이 새로운 py파일을 만들어 보아야 했습니다.

 

그리고 나서 다음으로 해야 할일은, 일단 QThread와 메인 스레드간의 통신을 위해서 당연 QThread역할을 할 스레드도 필요하지만, 더불어서 시그널을 담당하는 pyqtSignal()도 필요합니다.

 

먼저 위 스크린샷에서 볼 수 있는 것처럼 먼저 해 주어야 하는 일이라면, QThread()라는 것을 지정하고, moveTothread()라는 메서드로 넣어주는 과정이 먼저 필요합니다.

 

그리고 나서 다음으로 QThread역할을 하는 클래스로 가서, 위 스크린샷에서 볼 수 있는 것처럼 @라고 데코레이션을 붙여놓은 것을 만들어 주어서 일단 작업이 될 수 있도록 만들어 주도록 합니다.

 

 

그리고 나서 다음으로 해야 할일은 메인 스레드에서 지정된 신호가 나오면, QThead의 어떤 메서드와 연결이 될 것인지를 지정해 주어야 합니다.

 

그리고 나서 다음으로 해야 할일은 신호가 발생되게 만들기 위해서는, 위 스크린샷에서 볼 수 있는 것처럼 self.신호명.emit()이라고 적어 주면 됩니다.

 

그리고 나서 다음으로 할 것은 신호를 발생시키기 위한 메서드를 progress bar를 작동심키는 코드 대신 호출하는 것 입니다.

 

일단 이렇게 해서 신호를 발생시키는 것 까지는 선공했습니다. 이렇게 하는 것으로 어떻게 메인 스레드에서 QThread에 있는 메서드를 작동 시킨느 것은 성공했습니다. 이제 다음으로 해야 할일은 변수를 어떻게 전달을 하느냐 입니다.

 

먼저 이 작업을 하기 위해서는 위 스크린샷처럼 신호를 정의하는 단계에서 빈칸에 문자열이면 string,  숫자면 int나 float를 지정해야 합니다.

 

그리고 나서 다음으로 신호를 발생시키는 메인 스레드의 메서드로 가서는, 위 스크린샷에서 볼 수 있는 것처럼 int()함수까지 억지로 붙여서 한번 작업을 실행하도록 합니다.

 

그리고 나서 이 값도 받았으면 표시가 되도록 조치를 취해 주도록 합니다. 물론 여기서는 위에 있는 데코레이션도 @에서 int라고 받으려는 값을 지정해 주어야 합니다.

 

이렇게 해서 메인 스레드에서 보내는 숫자가 제대로 작업이 되는 것을 확인할 수 있었습니다. 이렇게 해서 메인 스레드에서 QThread로 데이터를 보내는 데는 성공했습니다. 다만 이렇게 한다고 해서 당초의 목적인 GUI의 프리징 방지에는 아직도 한참이나 멀었는데, 어쨎든 간에 계속해서 가 보도록 하겠습니다.

반응형