crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QThread и QNetworkAccessManager
di.em
  опции профиля:
сообщение 17.3.2011, 14:14
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 17.3.2011
Пользователь №: 2511

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть класс Thread наследуемый от QThread
вот его run():

void Thread::run()
{
    QNetworkAccessManager  nm;
    nm.get(QNetworkRequest(QUrl("http://doc.qt.nokia.com/latest/qthread.html")));
}


при создании нескольких объектов данного класса + ->start()

Часто конфликты мутексов и памяти:
QMutex::lock: mutex lock failure: Недопустимый аргумент
*** glibc detected *** ... : corrupted double-linked list: 0x081f8e18 ***
...

Объясните пожалуйста причину такого странного поведения
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ufna
  опции профиля:
сообщение 17.3.2011, 20:39
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


я лично делаю один слот finished, но в зависимости от objectName, который я задал QReply (который в финишд и войдет как sender()), кидаю разным обработчикам и все. Один слот, один механизм, профит.


Не понял правда в чем заключается последний вопрос :) По сабжу в принципе объект удаляется при выходе из функции, но какому потоку он принадлежит? Тут все так лево, что с асинхронными апи надо быть уверенным что все лежит там, где надо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
di.em
  опции профиля:
сообщение 17.3.2011, 23:30
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 17.3.2011
Пользователь №: 2511

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ufna @ 17.3.2011, 21:39) *
Не понял правда в чем заключается последний вопрос :) По сабжу в принципе объект удаляется при выходе из функции, но какому потоку он принадлежит? Тут все так лево, что с асинхронными апи надо быть уверенным что все лежит там, где надо.


Если сделать что то вроде

void Thread::run()
{
    QNetworkAccessManager  nm; // nm в треде Thread
    nm.get(QNetworkRequest(QUrl("http://doc.qt.nokia.com/latest/qthread.html")));
    exec();
}


И не вешать, никаких сигналов на quit() трэда (run никогда не завершиться, а nm не будет удалён), всё равно выскакивают ошибки конфликтов мьютэксов и выделения памяти. Интересно почему так ведёт себя, nm видимо использует какие-то общие ресурсы, не знаю.
Ну собственно вы с подобным поведением (судя по вашей статье) тоже сталкивались.

Так то программу переписал, более удобно для себя, без использования трэдов, как и положенно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.1.2025, 22:06