![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
AltA |
![]()
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 3 Регистрация: 16.2.2015 Пользователь №: 4339 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Приветствую.
Возникает проблема при работе приложения. Debug пишет:
нагуглил: эта строка значит что я использую элемент qlist'а, в то врема, как qlist пуст. код выгледит примерно так
Масивы ips и ports пополняются в функции этого класса, в ней же устанавливается ok1 = true; ключевое слово volatile при обьявлении ok и ok1 эфекта не даёт, и судя по всему в моём коде просто некоректно работает функция isEmpty() знаю что подход к потокам извращенский, пробывал QtConcurrent::run, QThreadPool, в слотах QThread писал проверку, результат - последующий сокет ждёт 30 сек чека предидущего, даже если они чекаются в разных потоках. так вроде работает в несколько потоков. ps не пинайте по лицу, самоучка, недавно подружился с qt спасибо |
|
|
![]() |
wiz29 |
![]()
Сообщение
#2
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: ![]() ![]() ![]() |
Судя по куску кода: нет потокобезопасного обращения к спискам из разных потоков. Советую сделать хотябы объект синхронизации доступа (QMutex или QReadWriteLock) к ips и ports.
В приведенном куске кода происходит изъятие элементов, где то происходит заполнение этих контейнеров, все это должно быть "обложено" доступом к данным через объект синхронизации. Сообщение отредактировал wiz29 - 16.2.2015, 18:50 |
|
|
AltA |
![]()
Сообщение
#3
|
Новичок Группа: Новичок Сообщений: 3 Регистрация: 16.2.2015 Пользователь №: 4339 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Судя по куску кода: нет потокобезопасного обращения к спискам из разных потоков. Советую сделать хотябы объект синхронизации доступа (QMutex или QReadWriteLock) к ips и ports. Да тут вообще много чего надо доделать ![]() только проблема конкретно в isEmpty()
вот это работает как надо(точнее нужно ещё добавить один элемент, который, как я понял,остаётся висеть внутри очереди). с 0 в if'е она вылетает с той же ошибкой. цифра 1 означает что в очереди элемент остался? комп получается его не видет. почему? |
|
|
wiz29 |
![]()
Сообщение
#4
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: ![]() ![]() ![]() |
потому что вызов метода isEmpty и size тоже должны быть защищены мьютексом.
bool QList::isEmpty () const Returns true if the list contains no items; otherwise returns false. Можно и этим методом пользоваться. Проблемы не должно быть. Да, и рекомендую использовать автоматические объекты для захвата объектов синхронизации (QMutexLocker, QReadLocker/QWriteLocker). Сообщение отредактировал wiz29 - 16.2.2015, 20:00 |
|
|
AltA |
![]()
Сообщение
#5
|
Новичок Группа: Новичок Сообщений: 3 Регистрация: 16.2.2015 Пользователь №: 4339 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
потому что вызов метода isEmpty и size тоже должны быть защищены мьютексом. bool QList::isEmpty () const Returns true if the list contains no items; otherwise returns false. Можно и этим методом пользоваться. Проблемы не должно быть. Да, и рекомендую использовать автоматические объекты для захвата объектов синхронизации (QMutexLocker, QReadLocker/QWriteLocker). я наверно зря на потоки грешил... тут то почему вышибает? мне нужно поспать ![]() . |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 24.5.2025, 16:57 |