2013-10-10 3 views
1

После много экспериментов и обучения из stackoverflow я создал работника QObject, 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-> Start() начинает eventloop в QThread (так как это, кажется, работает). Теперь проблема ... как остановить поток? Я пробовал:

QThread::quit(); 

но поток все еще работает, когда я завершаю приложение. Означает ли это, что цикл exec не работает? Нужно ли мне что-то делать, чтобы остановить этот поток? Или это фактически остановлено, но просто не удалено?

+0

BTW, вы используете старый код из моего ответа, вы можете посмотреть рефакторинг, который я сделал, вам больше не нужно выводить из 'QTcpServer' :) –

ответ

-1

Плохая идея убить бегущую нить, с точки зрения дизайна и технической точки зрения. Обычно поток должен иметь решение об отказе, основанном на флаге «завершить». Например, создайте новый флаг «stop», если сигнал quit() сигнализирован, отметьте флаг true. В функции потока проверяйте флажок периодически, и если это правда - выйдите из функции потока.

+0

Этот код фактически устанавливает цикла событий внутри QThread. Из документации, quit() должен изящно выйти. У меня такое чувство, что методы потоков просто ничего не слышат, чтобы выйти ... – shash

+3

Я понял это ... Мне пришлось подключить готовый сигнал потока к слоту для удаления нити; то это сработало. Итак, поток был остановлен, просто не удален – TSG

+0

@ Мишель: Вы правы. –

Смежные вопросы