У вас есть пара взаимосвязанных вопросов.
Для меня самый важный вопрос касается сигналов / слотов, работающих с потоками.
Когда используются сигналы / слоты в одном потоке, Qt по умолчанию предполагает AutoConnection или "прямое" соединение.В режиме прямого подключения сигнал / слоты действуют почти так же, как функция обратного вызова.Это означает, что функция, излучающая сигнал, по существу выполняет вызов подпрограммы.
При передаче сигнала / слотов по потокам Qt по умолчанию предполагает QueuedConnection по умолчанию.Что здесь происходит, то сложно.Последовательность -
- Излучаемый сигнал принимается QApplicationCore.
- Ядро создает глубокую копию аргументов в пространстве данных потока приема слота.
- Управление возвращается к функции, которая испустила сигнал.
- Ядро вызывает слот, когда может, основываясь на очереди событий.
Итак, зная это, вернемся к исходному вопросу: как узнать, когда функция слота прекратила обработку?У Qt нет идиомы, что я знаю, как передать эту информацию обратно.Но идиома с сигналом / слотами Qt состоит в том, что поток сигнализации не должен ничего знать о том, как функционирует слот или каков тип соединения.
Поэтому я рекомендую передавать данные через указатель на данныебыть обработанным.В данные я бы добавил два поля -
- Флаг результата.Как минимум, это должно включать состояния «Не начато», «Завершено», «Завершено с ошибками» и «Функция прервана».Флаг «Прерванная функция» будет установлен в блоке catch блока try / catch.
- Поле сторожевого таймера, основанное на QDateTime , установленное на текущую дату / время, когда излучается сигнал.Если поток сигнализации использует это значение, чтобы определить, полностью ли произошел сбой потока-потребителя.
Использование этого подхода - - Нет никаких причин, по которым вызывающий поток должен иметь какие-либо прямые знания о сигнальном потоке.- В этой структуре нет ничего, что нужно менять, если вы переходите с однопоточного или многопоточного.
Надеюсь, это поможет вам решить проблему.Именно такой подход мы сейчас используем в нашем магазине.