LINUX.ORG.RU

Не вызыватся слот в отдельном потоке (соединение Qt::QueuedConnection)

 , , ,


0

1

Имею проект: https://github.com/xintrea/mytetra_dev
Коммит: f3c08a83 (ветка experimental), это просто последний коммит на текущий момент.

У меня есть класс EditorShowTextDispatcher (далее буду называть его просто Dispatcher), который переносится в отдельный поток относительно кода основного приложения. Перенос делается согласно памятке:

Последовательность переноса объекта в отдельный поток для Qt5

Код класса Dispatcher расположен по пути:

/app/src/libraries/wyedit/EditorShowTextDispatcher.cpp

Перенос в отдельный поток происходит в конструкторе данного класса. Перенос осуществляется методом moveToThread(), он вызывается, естественно, ДО настроек коннектов данного класса.

Настройка коннекта для вызова слота класса Dispatcher происходит в классе PeriodicCheckBase:
/app/src/libraries/PeriodicCheckBase.cpp

Настройка коннекта происходит в методе init(). Он вызывается после отработки конструктора класса Dispatcher, то есть после переноса класса Dispatcher в отдельный поток. В коннекте соединяются методы:
c=connect(this, 
          &PeriodicCheckBase::doUpdateDetachedWindows,
          EditorShowTextDispatcher::instance(),
          &EditorShowTextDispatcher::closeWindowForNonExistentRecords,
          Qt::QueuedConnection);

Испускание сигнала doUpdateDetachedWindows() происходит в методе timerEvent() данного класса PeriodicCheckBase.

Создание коннекта происходит успешно, я проверяю результат работы connect(), там все в порядке. В консоль никаких ворнингов в рантайме не сыплется.

Проблема в том, что слот closeWindowForNonExistentRecords() не вызывается.

Если же поменять тип соединения на Qt::DirectConnection, то слот отрабатывает нормально.

Вопрос: где еще что надо докручивать, чтобы слот можено было вызвать в отдельном потоке?

★★★★★

Последнее исправление: Xintrea (всего исправлений: 3)

Вопрос: где еще что надо докручивать, чтобы слот можено было вызвать в отдельном потоке?

Не ручаюсь, но вроде можно вызывать всегда и везде, просто если не следовать правилам то наступишь на мину, будет ненадежно

А то что не вызывается, значит может быть что-то с event loop?

Нужно воспроизвести минимальный пример у себя, дать другим в виде zip архива. Я бы посмотрел

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

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

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Надо минималку, я попробую помочь, другие тоже подключатся. В Qt 5 всё не так плохо, не может оно не работать. А так посмотрим, поправим как лучше делать потоки. В большом проекте уловить суть проблемы тяжело, могут другие части программы влиять

Когда я начинал работать с Qt у меня такие проблемы были сплошь и рядом, сейчас же работа с потоками в Qt мне кажется очень надежной и простой

I-Love-Microsoft ★★★★★
()

Если же поменять тип соединения на Qt::DirectConnection

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

А после того, как уберёшь ненужный аргумент, добавь в конструктор mThread->start();

XMs ★★★★★
()
Ответ на: комментарий от xaizek

Не хватает: mThread->start()

Благодарю, да, в этом и было дело. Совсем разучился прогать: пишу кучу кода, вроде все учитываю, но могу забыть какую-нибудь важную команду.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

mThread->start()

Рад что всё решилось. На минималке бы это было видно. Хорошо что другие обладают libastral ^_^

I-Love-Microsoft ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.