У меня есть приложение Qt, которое запускает два потока из основного потока при запуске. Оба этих потока выполняют сетевые запросы, используя различные экземпляры объекта QNetworkAccessManager. Моя программа продолжает сбой примерно в 50% случаев, и я не уверен, какой поток сбой.Ошибка приложения Qt при выполнении 2 сетевых запросов из 2 потоков
Передача данных или передача сигналов между двумя потоками отсутствует. Когда происходит определенное событие, один поток сигнализирует основной поток, который может в свою очередь сигнализировать второй поток. Однако, печатая журналы, я вполне уверен, что авария не происходит во время сигнализации.
Структура обеих нитей следующая. Там вряд ли какая-то разница между нитями для URL, кроме т.д.
MyThread() : QThread() {
moveToThread(this);
}
MyThread()::~MyThread() {
delete m_manager;
delete m_request;
}
MyThread::run() {
m_manager = new QNetworkAccessManager();
m_request = new QNetworkRequest(QUrl("..."));
makeRequest();
exec();
}
MyThread::makeRequest() {
m_reply = m_manager->get(*m_request);
connect(m_reply, SIGNAL(finished()), this, SLOT(processReply()));
// my log line
}
MyThread::processReply() {
if (!m_reply->error()) {
QString data = QString(m_reply->readAll());
emit signalToMainThread(data);
}
m_reply->deleteLater();
exit(0);
}
Теперь странная вещь, что если я не начать один из потоков, программа работает нормально, или, по крайней мере, не врезаться в около 20 приглашений. Если оба потока выполняются один за другим, программа не сбой. Программа запускает только в половине случаев, если я запускаю и запускаю оба потока одновременно.
Еще одна интересная вещь, которую я собрал из журналов, заключается в том, что всякий раз, когда программа выходит из строя, строка, помеченная комментарием my log line
, является последней, которая будет выполняться обоими потоками. Поэтому я не знаю, какой поток вызывает крах. Но это заставляет меня подозревать, что QNetworkAccessManager как-то виноват.
Я довольно пуст о том, что вызывает крушение. Буду признателен за любые предложения или указатели. Заранее спасибо.
Я столкнулся с двумя сообщениями (неправильный путь и правильный путь) довольно поздно в разработке приложения. Мой Java-фон тоже не помог, где вы обычно расширяете Thread для потоковой обработки. Независимо от того, что проблема связана с самим диспетчером сетевого доступа, а не с потоком. Я попробую данный подход с фрагментом кода, который воспроизводит проблему. Пожалуйста, дайте свои данные о любых нюансах QNetworkAccessManager, которые могут отсутствовать. Благодарю. – Sameer
См. Мой отредактированный ответ –
И еще одно редактирование –