crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> сигнал 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  


Вот код:
// ================= 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
  опции профиля:
сообщение 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() вызывается нажатием кнопки мыши что блокирует петлю событий. осталось понять что теперь с этим делать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 6:12