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, 17:00
Сообщение #2


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

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

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




Репутация:   5  


http://ufna.ru/2010/10/27/qt-qnetworkacces...ger-multithread
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
di.em
  опции профиля:
сообщение 17.3.2011, 20:03
Сообщение #3


Новичок


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

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




Репутация:   0  


Цитата(ufna @ 17.3.2011, 18:00) *



Да, спасибо, вчера надыбал эту тсатью.
Всё равно не понимаю сути.

У меня какая ситуация, есть свой класс Http (синхронный), то есть ->post или ->get, далее луп кручу эвентов, пока не будет finished или readyRead от нетворкменеджера.

Сделал так, потому что, если вешать на каждый finished свой слот - то при последовательном скачивании нескольких страниц с разными url и дальнейшей обработкой - получаеться очень много кода (куча слотов), очень сложно отлаживать.

Буду конечно переделывать, и хорошенечко ещё посмотрю http://ufna.ru/2010/10/27/qt-qnetworkacces...ger-multithread.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 17.3.2011, 20:39
Сообщение #4


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

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

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




Репутация:   5  


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


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


Новичок


Группа: Новичок
Сообщений: 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 видимо использует какие-то общие ресурсы, не знаю.
Ну собственно вы с подобным поведением (судя по вашей статье) тоже сталкивались.

Так то программу переписал, более удобно для себя, без использования трэдов, как и положенно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 18.3.2011, 1:32
Сообщение #6


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

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

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




Репутация:   5  


честно говоря, я забыл уже чего там ) проблема была, разобрался, понял что так делать не стоит, запомнил что надо делать и забыл почему. Там с потоками и "родительствами" все связано, завтра посмотрю, сегодня сидр имеет место быть (
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
di.em
  опции профиля:
сообщение 18.3.2011, 2:52
Сообщение #7


Новичок


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

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




Репутация:   0  


Цитата(ufna @ 18.3.2011, 2:32) *
честно говоря, я забыл уже чего там ) проблема была, разобрался, понял что так делать не стоит, запомнил что надо делать и забыл почему. Там с потоками и "родительствами" все связано, завтра посмотрю, сегодня сидр имеет место быть (


Ну спасибо всё равно, если бы не статься я зашёл бы в полный ступор )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.3.2024, 12:09