Russian Qt Forum
Ноябрь 22, 2024, 22:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: aboutToQuit() отловить в дочерем потоке  (Прочитано 3786 раз)
RedDog
Гость
« : Июнь 07, 2011, 13:32 »

Необходимо до выхода из приложения завершить в объекте, который создается в дочернем потоке, некоторые операции (запись состояния в файл).

при созданнии объекта в дочернем потоке, сединяю aboutToQuit() со своим слотом:

Код:
NetworkConnection::NetworkConnection(QObject *parent) :
    QObject(parent)
{
    connection = new QSslSocket(this);
    connect(connection, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
            this, SLOT(on_socketStateChanged(QAbstractSocket::SocketState)));
    connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(on_applicationQuit()));
}
void NetworkConnection::on_applicationQuit()
{
    connection->disconnectFromHost();
}

void NetworkConnection::on_socketStateChanged(QAbstractSocket::SocketState state)
{
if (state == QAbstractSocket::UnconnectedState)
{
           if (fileSize > 0)
            {
            ApplicationSettings settings;
            if (totalRecived != fileSize && totalRecived > 0)
            {
                settings.setValue("LasFileName", outputFile->fileName());
                settings.setValue("DisconnectPosition", totalRecived + 1);
                settings.setValue("HashFile", md5File);
            }
            else
            {
                settings.setValue("LasFileName", QVariant());
                settings.setValue("DisconnectPosition", QVariant());
                settings.setValue("HashFile", QVariant());
            }
            emit complete((totalRecived == fileSize), totalRecived);
        }
resetData();
   }
}
Проблема в том, что, слот NetworkConnection::on_applicationQuit() отрабатывает нормально, затем при разрыве соединения вызывается слот NetworkConnection::on_socketStateChanged, и вроде как начинает работать, но после первой строчки записи в файл приложение завершается. Т.е. поток принудительно убивается слотом приложения quit() и не до конца завершается.
Как корректно убить поток, что бы завершились все предварительные действия?
PS: в самом классе потока есть обработчик сигнала complete(bool, qint64), но до вызова этого сигнала так и не доходит.
« Последнее редактирование: Июнь 07, 2011, 13:34 от RedDog » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Июнь 07, 2011, 17:41 »

естессно, qApp не будет ждать другой поток. Можно повесить хэндлер в глав потоке, к-ый будет делать wait() дочернего. Еще можно в деструкторе треда wait() сделать
Записан
RedDog
Гость
« Ответ #2 : Июнь 07, 2011, 22:48 »

решил немного через зад... в общем шлю в поток сигнал, на который в теле объекта, работающего в потоке стоит qApp->quit(); т.к. поток дочерний один, то синхронизировать особо нечего и при таком выходе ничего не валится (пока, дальше посмотрим, потестим).
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Июнь 08, 2011, 16:08 »

Лолщ, не валится, ппц. Ну ооок.
А, и не будет, уболтали, это СТАТИК слот%). Но не делайте так больше.
« Последнее редактирование: Июнь 08, 2011, 16:09 от Авварон » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.