Сделал по аналогии с http://habrahabr.ru/post/150274/ создание и удаление потока тока добавил сигнал/слот destroyed() для удаления обёртки и потока.
ClientSocketThread * CT - объектс обёртки
QThread * ClientThread - объект потока.
Вот код:
// ================= clientsocket.h ==================
class ClientSocketThread : public QObject
{
Q_OBJECT
public:
ClientSocketThread(QObject * parent = 0);
~ClientSocketThread();
TClientSocket * CS;
QTimer * ptimer;
bool ready;
protected:
// пока не используем)
void _run();
private:
volatile bool stopped;
QObject * MW;
public slots:
void process(); /* процедура потока */
void stop(); /* останавливает поток */
void update();
signals:
void finished(); /* сигнал о завершении работы */
};
// =========== mainwindow.cpp ======================
void MainWindow::CreateClientThread()
{
isDeleted = 0;
CT = new ClientSocketThread();
clientthread = new QThread;
CT->moveToThread(clientthread);
// Нужно получать информацию о событие удаления
connect(clientthread, SIGNAL(destroyed(QObject* )), this, SLOT(onDestroyCT(QObject* )));
connect(CT, SIGNAL(destroyed(QObject* )), this, SLOT(onDestroyCST(QObject* )));
//При запуске потока будет вызван метод process()
connect(clientthread, SIGNAL(started()), CT, SLOT(process()));
//При завершении работы, обертка передаёт потоку сигнал finished(),
//вызвав срабатывание слота quit()
connect(CT, SIGNAL(finished()), clientthread, SLOT(quit()));
// Обертка помечает себя для удаления при окончании работы
connect(CT, SIGNAL(finished()), CT, SLOT(deleteLater()));
// Поток пометчает себя для удаления, по окончании работы.
// Удаление будет произведено только после полной остановки потока.
connect(clientthread, SIGNAL(finished()), clientthread, SLOT(deleteLater()));
// Запускаем поток, он запускает process()
clientthread->start();
}
void MainWindow::DeleteClientThread()
{
CT->stop();
while(!(isDeleted == 2));
}
void MainWindow::onDestroyCT(QObject* obj)
{
isDeleted++;
}
void MainWindow::onDestroyCST(QObject* obj)
{
isDeleted++;
}
// ========================= clientsocket.cpp ===========================
ClientSocketThread::ClientSocketThread(QObject * parent)
{
MW = parent;
stopped = false;
ready = false;
//ptimer = new QTimer();
//connect(ptimer, SIGNAL(timeout()), this, SLOT(update()));
//ptimer->start(1000);
}
ClientSocketThread::~ClientSocketThread()
{
//delete ptimer;
}
void ClientSocketThread::stop()
{
stopped = true;
}
void ClientSocketThread::update()
{
ready = false;
}
void ClientSocketThread::_run()
{
while (!stopped)
{
}
}
void ClientSocketThread::process()
{
QString infostr = "hello !!!";
while (!stopped)
{
//while (!ready && !stopped);
//QCoreApplication::postEvent(MW,new TS_SocketEvent(SocketEventDebug,infostr));
ready = true;
}
emit finished();
}