Безопасен ли прямой доступ _myObj-> member2 ();от Worker :: work?
Скорее всего нет.Это будет зависеть от реализации, но, вообще говоря, вызов методов между потоками редко бывает безопасным.Чтобы сделать это безопасным, вам необходимо применить блокировки / мьютексы к тому, к чему обращаются (прямо или косвенно) из этого метода, и обеспечить, чтобы все, что вы вызываете из этого метода, также было поточно-ориентированным.К счастью, сигнал Qt и слоты абстрагируют это, так что вам не нужно об этом беспокоиться.
Если нет, я должен заменить этот вызов на механизм сигнала и слота?
Вы должны вследующим образом:
QObject::connect(_thread, &QThread::started, _worker, &MyObject::work);
Удалить прямой вызов MyObject::work()
.Также учтите:
QObject::connect(_thread, &QThread::finished, _thread, &QThread::deleteLater);
Обратите внимание, что QObject::connect
является безопасным для жизни .Он может быть вызван из любого потока любого объекта в любом потоке в любое время.
Если я должен ... почему именно?
Вызов объекта в другом потокечем ваш опасен по своей природе.Безопасен ли метод, который вы называете потоком?С QObjects
существует дополнительная проблема отправки сигналов и вызова слотов.work()
делает это?Если к тому времени, когда вы вызовете work()
, цикл обработки событий в потоке будет NOT , запущенное приложение завершится сбоем или, по крайней мере, не отправит сигнал.Соединяя QThread::started
и MyObject::work
, вы гарантируете, что метод вызывается правильно в работающем потоке и с циклом запуска событий в правильной последовательности.
Для полноты без сигналов и слотов вы должны сделать это, чтобы убедиться, что он будетработать как положено:
if(_thread->isRunning())
_worker->work();