сигнал destroyed() не вызываеться, В чём может быть дело ? |
Здравствуйте, гость ( Вход | Регистрация )
сигнал destroyed() не вызываеться, В чём может быть дело ? |
Pechkin |
13.3.2014, 19:21
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 9 Регистрация: 30.1.2014 Пользователь №: 4044 Спасибо сказали: 0 раз(а) Репутация: 0 |
Сделал по аналогии с 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 |
13.3.2014, 20:42
Сообщение
#2
|
Новичок Группа: Новичок Сообщений: 9 Регистрация: 30.1.2014 Пользователь №: 4044 Спасибо сказали: 0 раз(а) Репутация: 0 |
|
|
|
Pechkin |
13.3.2014, 22:57
Сообщение
#3
|
Новичок Группа: Новичок Сообщений: 9 Регистрация: 30.1.2014 Пользователь №: 4044 Спасибо сказали: 0 раз(а) Репутация: 0 |
Может всётаки ктонить знает в чём дело ?
Почему не срабатывает связка: connect(clientthread, SIGNAL(destroyed(QObject* )), this, SLOT(onDestroyCT(QObject* ))); connect(CT, SIGNAL(destroyed(QObject* )), this, SLOT(onDestroyCST(QObject* ))); |
|
|
Pechkin |
14.3.2014, 19:17
Сообщение
#4
|
Новичок Группа: Новичок Сообщений: 9 Регистрация: 30.1.2014 Пользователь №: 4044 Спасибо сказали: 0 раз(а) Репутация: 0 |
В чём дело кажется разобрался. Метод DeleteClientThread() вызывается нажатием кнопки мыши что блокирует петлю событий. осталось понять что теперь с этим делать.
|
|
|
Текстовая версия | Сейчас: 22.12.2024, 9:32 |