2013-10-10 6 views
1

많은 실험과 stackoverflow에서 배운 후, QObject worker, QThread를 만들고 QObject를 QThread로 옮기고 QThread를 시작했습니다.Qt C++ 어떻게 멈추는 경우 moveToThread

void TelnetServer::incomingConnection(qintptr socketDescriptor) 
{ 
    QThread * TelnetConnectionThread = new QThread(this); 
    TelnetConnection *worker = new TelnetConnection(socketDescriptor,TelnetConnectionThread); 
    connect(TelnetConnectionThread, SIGNAL(started()), worker, SLOT(start())); 
    connect(TelnetConnectionThread, SIGNAL(finished()), worker, SLOT(deleteLater())); 
    worker->moveToThread(TelnetConnectionThread); 
    TelnetConnectionThread->start(); // Start the thread running 
} 

나는 전화 TelnetConnectionThread-이>() 시작 (가 실행 것으로 보인다 이후)에 QThread 내 eventloop를 시작한다고 가정합니다. 이제 문제는 ... 스레드를 어떻게 멈추게할까요? 시도 :

QThread::quit(); 

그러나 응용 프로그램을 종료하면 스레드가 계속 실행 중입니다. exec 루프가 실행되지 않는다는 것을 의미합니까? 이 스레드를 중지하려면 다른 작업을 수행해야합니까? 또는 실제로 중지되었지만 삭제되지 않았습니까?

+0

BTW, 내 대답에서 이전 코드를 사용하고 있습니다. 내가 한 리팩토링을 살펴보고 싶다면 더 이상 QTcpServer에서 파생 될 필요가 없습니다. –

답변

-1

디자인 및 기술적 관점에서 실행중인 스레드를 죽이는 것은 좋지 않습니다. 일반적으로 스레드는 "종료"플래그를 기반으로 종료 결정을 소유해야합니다. 예를 들어, 새 플래그 "stop"을 작성하십시오. quit() 슬롯에 신호가 보내지면 플래그를 true로 표시하십시오. 스레드 함수에서 플래그를 주기적으로 확인하고 이것이 사실이라면 스레드 함수를 종료하십시오.

+0

이 코드는 실제로 QThread 내부의 이벤트 루프. 문서에서 quit()가 정상적으로 종료되었다고 가정합니다. 스레드 메서드가 종료 할 청취가 전혀 없다는 느낌이 들었습니다. – shash

+3

나는 그것을 알아 냈습니다 ... 스레드의 완료 신호를 스레드의 deletelater 슬롯에 연결해야했습니다. 그 때 그것은 작동했다. 스레드가 중지되었으므로 삭제되지 않았습니다. – TSG

+0

@Michelle : 정확합니다. –