Какви примитиви за синхронизация съществуват в Qt5, които биха ми позволили да изчакам сигнала да пристигне в една нишка?

В моето приложение имам нужда да блокирам изпълнението, докато пристигне сигнал (изчакайте уеб заявката да приключи). Това се случва в нишка без gui.

Разглеждане на пример за блокиране на fortune клиент в Qt 5.3 документи, изглежда, че използва метода 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