Задать вопрос
xztau
@xztau
Я

Чем можно заменить циклы ожидания ответа в Qt?

Предположим есть вызываемая функция, возвращающая целое:
int getNumber(void);

И в этой функции есть некоторая работа по сигналу, приконнекченному к слоту slotGET, когда int получено.
int k;
int getNumber(void) {
 emit signalGET();
/*--------------------------*/
while(!done){}
/*--------------------------*/
return k;


slotGET
{
k = /*что-то там*/; 
emit done;
}


То есть нужно дождаться, пока к будет получено, а то возвращать нечего.
Как грамотно сделать ожидание получения переменной к?

P.S. !done это я так, для ситуации, ибо не знаю чего делать
  • Вопрос задан
  • 3854 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Переделать архитектуру так, чтобы работник выполнялся в отдельном потоке и отсылал сигнал по готовности.
Ответ написан
AxisPod
@AxisPod
А потом будете спрашивать почему это компьютер тормозит? Делать такие бесконечные циклы нельзя, никогда. Выжирают полностью ядро на 100%.
Ответ написан
donkaban
@donkaban
Умею рисовать тени
к слоту GET добавить сигнал и слот POST, скажем. Зачем ждать, у вас асинхронное взаимодействие, так и работайте в event-driven окружении, благо это Qt.
Ответ написан
Комментировать
Если у Вас signalGET и slotGET подключены через DirectConnection, и в слоте slotGET нет асинхронных операций, то никакие циклы ожидания не нужны. Контекст выполнения после вызова signalGET пойдёт в методе дальше только после завершения работы внутри signalGET.

В ином случае, можно воспользоваться различными подходами. Например, с QEventLoop код может выглядеть так:
int k;
int getNumber(void) {
   emit signalGET();

   QEventLoop event_loop;
   connect(this, SIGNAL(done()), &event_loop, SLOT(quit()));
   event_loop.exec();

   return k;
}

slotGET
{
k = /*что-то там*/; 
emit done;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы