11

Нужна помощь QT C++

Господа, нужна помощь по QT на C++ опытом/советом. Самоучка, осваиваю походу реализовывая конкретную цель для себя, хобби, бывает делаю как получается и как знаю, а не как по феншую. Итого: в одном потоке получаю данные по APl и записываю в глобальную переменную, в другом потоке считываю эту переменную, иногда видимо они пересекаются и приложение падает, мутексы не помогают или я неверно их использую. Это точно в этом месте, потому что я выяснил это на раннем этапе и кое-как боролся, функционал растет и старые методы борьбы дальше не подойдут. Может в комментах телегу свою кто напишет, чтобы связаться и помочь советом? Есть еще проблемы с АРI, падает связь иногда и программно не получается восстановить (т.е. пробовал удалить и создать NetworkManager и др., что сумел), помогает только перезапуск приложения.

upd. все, нашел, спасибо про совет запуска в дебаге. я до этого по дебагу не понимал где конкретная точка проблемы, вчера разобрался и он показал где: в одном потоке буффер очищался после прочтения, а в другом прилетали и записывались новые данные. добавил еще один мутекс в эту часть кода и для верности передаю буффер в другой поток в составе сигнала (как аргумент) при вызове слота

Лига программистов

2.3K постов12K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества

0
Автор поста оценил этот комментарий

Во первых, когда речь идёт о одной единственной переменной, - нужно отключать оптимизацию,  ключевое слово volatile, при объявлении. Во вторых, работа с одной переменной запись/чтение особого смысла не имеет, если это только не счётчик/флаг. Обычно лочат какой-нибудь ресурс или очередь, а не переменные.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
я упростил немного, переменная выглядит примерно так QMap < QString, QMap <QString, item>> data, т.е. это таблица из таблиц, где item - это Struct {double а, double b, и еще с, d, e}. простите, с телефона пишу с работы, нет возможности вставки кода. спасибо за помощь, я почитаю про volatile. т.е. цель блокировки была в том, что работа с данными занимает некоторое время
0
Автор поста оценил этот комментарий

Я думаю, что у вас два раза определена переменнная mutex.

Вы видимо используете разные переменные мьютекса в разных потоках. А название у них одинаковое и это вас сбивает с толку. Мьютекс должен быть в единственном экземпляре доступен из разных потоков.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
вот да, сначала в каждом классе-потоке был свой экземпляр, я это заподозрил и создал единственный на весь проект экземпляр в глобальном пространстве, но чет не помогло сходу. еще раз вашу версию проверю, спасибо
0
Автор поста оценил этот комментарий

может все таки код в студию? или не будем превращать Пикабу в Стэковерфлоу...

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

А в этом другом классе и потоке мутекс использовался?

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

Любой хостинг исходников: github.com или bitbucket.org, к примеру. Проблема пока описана очень абстрактно, поэтому сейчас в комментах идет новый сезон шоу "Битва экстрасенсов" (=

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
затихнет немного шоу, перечитаю комменты и вечером буду пробовать разные способы. я правда хз как в моем говнокоде можно разобраться, да и не зареган я там нигде ))
0
Автор поста оценил этот комментарий

Ну так блокируй переменную для второго потока, пока в неё пишешь. Делов то.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
mutex.lock();
записываем
mutex.unlock()

не помогает, везде по коду так реализовано. и чтение тоже. что то не так делаю, а что не пойму
показать ответы
0
Автор поста оценил этот комментарий

Чувак, там куча вариантов как ты мог это сломать. Те надо будет кого-то нанимать.


Запускай под отладчиком debug сборку и лови вылет. Отладчики это умеют.

Кроме того, поскольку у тебя Qt, вместо глобальной переменной можно пулять данные сигналом. А глобальную переменную в многопоточности может быть чревато. Также см QReadWriteLocker и им подобные. Ну и есть смысл посмотреть на QFuture, т.к. с ним облажаться будет сложнее...

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
ловил дебаг на ранней стадии, но так и не смог разобраться в результатах, буду пробовать еще, спасибо. сигналы и слоты использую, просто не пробовал еще реализовать так, чтобы доступ к этой переменной был только у одного класса и потока, а другим передавалась копия, и при необходимости изменения из другого класса чтобы это делал класс-владелец по сигналу. надо будет попробовать, спасибо за идею. qfuture посмотрю, не знаком еще
4
Автор поста оценил этот комментарий

Мутексы - это правильно (хоть это и не единственный способ).

Не забывайте их использовать и там, где запись, и там, где чтение, во всех местах, где доступ к этой переменной.

Перед доступом к переменно мутекс забираете, после доступа отпускаете.

Частая ошибка начинающих - использовать мутекс только при записи.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
вчера для опыта запирал отпирал для одной переменной, все равно при запертом мутексе в одном потоке и классе смог изменить эту переменную из другого класса и потока. что то не так делаю просто, не пойму что
показать ответы
DELETED
Автор поста оценил этот комментарий

Не спец по Qt, но в вашем случае возможно подойдет паттерен producer - cunsomer, есть отлаженные реализации наверное подо все что можно, посмотрите в ту сторону.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
вчера встретил описание этого фунционала в qt, но до конца не усвоил, еще раз попробую осилить, спасибо
0
Автор поста оценил этот комментарий

Показать исходники для всех сразу было бы эффективнее, чем клянчить контакты.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
хз как показать исходник с 3мя классами по 500+ cтрок кода. постарался локально обозначить проблему. знакомых нет кто в режиме диалога мон бы подсказать, вот тут и написал
показать ответы
1
Автор поста оценил этот комментарий

Не могут мютексы не помогать. Обязательно помогут.

А вы какие мютексы используете?

QMutex или std::mutex?


Я бы советовал использовать где возможно только std вместо классов Qt

И вообще использовать Qt по минимуму

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
я обьявляю Qmutex в двух классах, каждый класс в своем потоке, далее при чтении и записи запираю и отпираю mutex.lock(), mutex.unlock(). пробовал создать глобальный мутекс и к нему обращаться из обоих классов и потоков. так и не понял эффекта: в одном классе запираю мутекс под которым для примера идет n++, n-- операция, из другого класса пробую изменить n - оно без проблем меняется, хотя как бы должно быть заперто, при этом соответственно первый класс зависает пока не отпущу unlock
показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества