Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: RedDog от Июнь 07, 2011, 13:32



Название: aboutToQuit() отловить в дочерем потоке
Отправлено: 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), но до вызова этого сигнала так и не доходит.


Название: Re: aboutToQuit() отловить в дочерем потоке
Отправлено: Авварон от Июнь 07, 2011, 17:41
естессно, qApp не будет ждать другой поток. Можно повесить хэндлер в глав потоке, к-ый будет делать wait() дочернего. Еще можно в деструкторе треда wait() сделать


Название: Re: aboutToQuit() отловить в дочерем потоке
Отправлено: RedDog от Июнь 07, 2011, 22:48
решил немного через зад... в общем шлю в поток сигнал, на который в теле объекта, работающего в потоке стоит qApp->quit(); т.к. поток дочерний один, то синхронизировать особо нечего и при таком выходе ничего не валится (пока, дальше посмотрим, потестим).


Название: Re: aboutToQuit() отловить в дочерем потоке
Отправлено: Авварон от Июнь 08, 2011, 16:08
Лолщ, не валится, ппц. Ну ооок.
А, и не будет, уболтали, это СТАТИК слот%). Но не делайте так больше.