Метод QNetworkAccessManager `get` вылетает при перезапуске

В настоящее время я добавляю в свое приложение функцию, позволяющую перезапускать его.

Вот как выглядит главное

int main(int argc, char *argv[])
{
const int RESTART_CODE = 1000;
int return_from_event_loop_code;
QPointer<QApplication> app;
QPointer<foo> main_window;
do
{
if(main_window)
delete main_window;
if(app)
delete app;

app = new QApplication(argc, argv);
main_window = new foo();
main_window->show();
app->setActiveWindow(main_window);

return_from_event_loop_code = app->exec();
}
while(return_from_event_loop_code==RESTART_CODE);

return return_from_event_loop_code;
}

Теперь первый раз работает нормально, однако, когда приложение перезапускается с помощью RestartApp метод, упомянутый ниже. Метод получения QNetworkAccessManager возвращает ошибку блокировки Вот как выглядит мой код

void foo::MethodA()
{
....
....
QUrl url("some url");
QNetworkRequest request;
request.setUrl(url);
networkManager = new QNetworkAccessManager(this);
QObject::connect(networkManager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*)),static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection));
currentReply = networkManager->get(request); //Crashes when the app is restarted again
connect(currentReply, SIGNAL(error(QNetworkReply::NetworkError)),this, SLOT(slotNetworkError(QNetworkReply::NetworkError)),Qt::UniqueConnection);
}

//Slot
void foo::replyFinished(QNetworkReply* rply)
{
....
.....
rply->deleteLater();
}

//Slot
void foo::RestartApp()
{
QCoreApplication::exit(1000);
}

Теперь вот что происходит, когда приложение запускается впервые, все в порядке. Однако, когда метод RestartApp вызывается и return_from_event_loop_code = app->exec(); метод в главном вызывается снова на этот раз в заявлении currentReply = networkManager->get(request); в MethodA приложение вылетает и заканчивается

mlock.c

void __cdecl _unlock (
int locknum
)
{
/*
* leave the critical section.
*/
LeaveCriticalSection( _locktable[locknum].lock );
}

Любая идея о том, почему приложение дает сбой в операторе get QNetworkAccessManager, когда приложение получает команду на перезапуск?

0

Решение

Я провел некоторое расследование аварии. Это действительно вызвано разрушением QApplication, QNetworkAccessManager внутренне использует QNetworkConfigurationManagerPrivate объект. Этот объект создается при необходимости и используется до завершения приложения. qNetworkConfigurationManagerPrivate Функция используется для создания или получения существующего объекта.

когда QApplication уничтожен, он выполняет все почтовые процедуры, в том числе connManager_cleanup, Эта функция косвенно разрушает QNetworkConfigurationManagerPrivate объект и наборы appShutdown местный флаг. Когда этот флаг установлен, qNetworkConfigurationManagerPrivate функция не будет создавать новые QNetworkConfigurationManagerPrivate объектов больше. Так после уничтожения QApplication QNetworkAccessManager становится неработоспособным.

Я думал, что это злоупотребление QApplication объект, но недавно я нашел доказательство ссылки, что использование является правильным.

механизм Qt Соглашения о кодировании государство:

Q [Core] Приложение — одноэлементный класс. Может быть только один экземпляр за раз. Однако этот экземпляр может быть уничтожен, а новый может быть создан.

Так что эта проблема должна рассматриваться как ошибка Qt.

0

Другие решения


По вопросам рекламы [email protected]