Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: сигнал destroyed() не вызываеться
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
Pechkin
Сделал по аналогии с 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();
}


Pechkin
Вот код:
// ================= clientsocket.h ==================
class ClientSocketThread : public QObject
{
Q_OBJECT
public:
ClientSocketThread(QObject * parent = 0);
~ClientSocketThread();
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;
}

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 (!stopped);
QCoreApplication::postEvent(MW,new TS_SocketEvent(SocketEventDebug,infostr));
}
emit finished();
}
Pechkin
Может всётаки ктонить знает в чём дело ?
Почему не срабатывает связка:
connect(clientthread, SIGNAL(destroyed(QObject* )), this, SLOT(onDestroyCT(QObject* )));
connect(CT, SIGNAL(destroyed(QObject* )), this, SLOT(onDestroyCST(QObject* )));
Pechkin
В чём дело кажется разобрался. Метод DeleteClientThread() вызывается нажатием кнопки мыши что блокирует петлю событий. осталось понять что теперь с этим делать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2018 IPS, Inc.