Какие примитивы синхронизации существуют в Qt5, которые позволили бы мне ждать поступления сигнала в одном потоке?

В моем приложении мне нужно заблокировать выполнение до тех пор, пока не поступит сигнал (дождитесь завершения веб-запроса). Это происходит в потоке без графического интерфейса.

Глядя на пример блокировки клиента удачи в Qt 5.3 docs, похоже, что он использует метод waitForConnected(), специфичен для класса QTcpSocket, но я использую QNetworkAccessManager, который вообще не имеет методов ожидания.

Я также читал в другом месте, что для этого может потребоваться создать временный QEventLoop, который будет блокироваться до завершения событий. Это решение поставляется с кучей предупреждений о том, что его не следует использовать в «производственном коде» из-за различных скрытых проблем, которые могут возникнуть в крайних случаях и т. д.

Так. Что делать парню?

Могу ли я как-то заставить это работать с QWaitCondition без введения второго потока? Какие примитивы синхронизации существуют в Qt5, которые позволили бы мне ждать поступления сигнала в одном потоке?

Спасибо!


person Lennart Rolland    schedule 01.08.2014    source источник
comment
Qt спроектирован так, чтобы быть асинхронным, то есть вам не нужно блокировать, за исключением нескольких необычных обстоятельств (например, модульные тесты). Если бы вы могли описать, чего вы пытаетесь достичь, возможно, кто-то мог бы предложить способ это сделать. без блокировки.   -  person MrEricSir    schedule 02.08.2014
comment
Такого рода ответы на вопрос: в Qt нет примитивов для блокировки сигналов, кроме запуска временного цикла событий.   -  person Lennart Rolland    schedule 04.08.2014
comment
Как насчет того, чтобы сделать это ответом, чтобы мы могли избавиться от этой ветки?   -  person Lennart Rolland    schedule 12.11.2014


Ответы (1)


Qt спроектирован так, чтобы быть асинхронным, то есть вам не нужно блокировать за исключением нескольких необычных обстоятельств (например, модульные тесты).

Если бы вы могли описать, чего вы пытаетесь достичь, возможно, кто-то мог бы предложить способ добиться этого без блокировки.

person MrEricSir    schedule 12.11.2014
comment
К сожалению, мой случай связан с доступом к неисправному оборудованию, поэтому нет никакого способа обойти это. - person Lennart Rolland; 12.11.2014