Member 12562336 Ответов: 1

Не используя qthread, но получая ошибку запуска qthread


Я использую QNetworkAccessManager для загрузки файлов на Google Диск. После загрузки около 1300 файлов я получаю следующую ошибку:

critical: Qthread::start:failed to create thread (the access code is invalid)


Я явно не использую никакой QThread, кроме основного потока.

Я использую QT 5.7.0

Что я уже пробовал:

Я использую только один экземпляр QNetworkAccessManager. Я также использую около 4 экземпляров QTimer для отображения часов и инициирования задач (отображение времени, скрытие окна через некоторое время и отображение пузырьковых сообщений)

Любая помощь будет оценена по достоинству.

Richard MacCutchan

Скорее всего, он вызывается внутри библиотеки QT.

Member 12562336

Спасибо.

Поскольку вы знакомы с QT, есть ли у вас какие-либо идеи, почему это сообщение отправляется из библиотеки QT?

Richard MacCutchan

Я ничего не знаю о QT. Но если вы используете библиотеку QT и получаете ошибку, относящуюся к qthread, то можно с уверенностью сказать, что это как-то связано с этой библиотекой.

Member 12562336

Конечно. Я знал, что он исходит из библиотеки, потому что там не было такого сообщения от моих кодов.

Это сообщение времени выполнения не от Windows, потому что Windows не знает QT.

Но я благодарю вас. Думаю, у меня есть идея, как ее решить. Похоже, что для обработки вызовов REST API для отправки пакетов на Google Диск было создано множество потоков. Все эти потоки были помечены для удаления, но все еще занимают память.

Я полагал, что все они привязаны к QNetworkAccessManager. Поэтому я собираюсь удалить и воссоздать QNetworkAccessManager. Я вещь, которую он собирается позаботиться о решении этой проблемы.

1 Ответов

Рейтинг:
7

Jochen Arndt

Ошибка

Qthread::start:failed to create thread (the access code is invalid)

возникает при попытке создать новый поток, в то время как на самом деле их слишком много.

QThreads используются внутренне для выполнения сетевых операций. Каждый QNetworkAccessManager функция, которая создает соединение (например, get() и post()) создаст новый поток для выполнения связи в фоновом режиме.

Если вы создаете несколько соединений одновременно, требуется много ресурсов. Каждый поток имеет свой собственный стек, размер которого зависит от компоновщика и системы (AFAIK Microsoft имеет по умолчанию 1 MiB и GCC 2 MiB).

Чтобы избежать создания слишком большого количества потоков, QNetworkAccessManager будет стоять в очереди запросов, но только для идентичных хостов:
Примечание: QNetworkAccessManager помещает полученные запросы в очередь. Количество запросов, выполняемых параллельно, зависит от протокола. В настоящее время для протокола HTTP на настольных платформах параллельно выполняется 6 запросов для одной комбинации хост/порт.

Таким образом, вы можете выйти из ресурсов, если подключитесь к разным хостам. Решением было бы реализовать собственную очередь, чтобы ограничить количество активных подключений.

Другой причиной ошибки может быть то, что объекты ответа не удаляются. Убедитесь, что они удалены после обработки (используйте deleteLater() при выполнении этого из обработчика сигналов).


Member 12562336

Спасибо. Я позабочусь о том, чтобы ресурсы были выпущены в нужном месте.