2012-06-24 8 views
0

별도의 스레드 내에서 GUI 위젯을 실행하는 것이 좋지 않다는 것을 알고 있습니다. 단지 메시지의 경우, 이것은 주 스레드에 대한 신호로 극복 될 수 있습니다. 그러나 스레드에 사용자 입력이 필요한 경우 어떻게 대답을 스레드로 다시 보낼 수 있으며 스레드는 해당 응답을 기다릴 수 있습니까?QThread :: run()에서 사용자 의견을 얻는 방법. QMessageBox?

내 경우는 libssh의 sftp를 사용하는 응용 프로그램입니다. 연결 및 인증 중에 사용자가 하나 이상의 질문에 대답해야 할 수 있습니다. 그러나 성능상의 이유로 모든 SSH/SFTP 항목은 별도의 스레드에서 실행되어야합니다.

+0

스레드를 시작하기 전에 사용자의 자격 증명을 얻을 수없는 이유는 무엇입니까? – eduffy

+0

단순한 암호 인증으로는 충분하지만 SSH 인증은 대화식 일 수 있습니다. 즉, 서버가 사용자에게 질문을하고 응답을 제공하고 서버가 다시 새 질문을 할 수 있습니다. – Pat

답변

1

GUI가 아닌 스레드에서 GUI 클래스를 전혀 사용할 수 없습니다. 신호와 슬롯을 사용하여 한 스레드에서 다른 스레드로 정보를 교환 할 수 있습니다. 작업자 스레드의 신호를 보내고 QWaitCondition과 같은 세마포를 기다립니다. 대답과 함께 메시지를 보냅니다.

사용자가 데이터를 입력 할 때까지 작업자 스레드를 중지하려면 연결 유형으로 Qt::BlockingQueuedConnection을 사용할 수도 있습니다. QInputDialog도 사용자가 데이터 입력을 완료 할 때까지 대기합니다.

+0

작업자 스레드로부터 신호를 보내는 경우 세마포를 기다려야하는 이유는 무엇입니까?! 작업자 스레드의 QObject는 자신의 슬롯에서 응답을 수신 할 수 있습니다. Qt는 적절한 연결 유형을 기본값으로 사용합니다. –

+0

질문은 작업자 스레드가 대답을 "대기"할 수있는 방법을 명확하게 물었습니다. 그래서 그 점이 중요하다고 생각했습니다. "수동으로"절차를 중지 할 필요가 없다면 다시 한 번 두 번째 문장에서 신호와 슬롯을 사용하여 정보를 교환 할 수 있습니다. 응답과 함께 메시지를 내 보냅니다. 그러나 묻는 사람은 이것을 이미 알고있는 것처럼 보였습니다. 그래서 나는 그 질문을 오해했을 것입니다. –

+0

명시 적 대기는 전혀 필요하지 않습니다. 뮤텍스를 기다리는 것은 이미 이벤트 루프가하는 일입니다. QObject는 GUI가 아닌 스레드로 이동했는지 여부에 관계없이 대부분의 시간을 기다립니다. 실제로 모든 코드를 실행하지 않습니다. 대답을 기다리는 것은 내재적입니다. 대답은 단순히 QObject의 슬롯에 연결되는 신호로 나타납니다. 비 GUI 스레드에서 GUI 클래스를 사용하는 것은 위젯에 신호를 보내는 것만으로 간단하게 수행됩니다. 예를 들어, QLabel에 텍스트를 설정하기 위해'QMetaObject :: invokeMethod (label, "setText", Q_ARG (QString, "foo"));'할 수 있습니다. –