Russian Qt Forum
Сентябрь 27, 2024, 12:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Смена получателя сигнала  (Прочитано 3054 раз)
White Owl
Гость
« : Апрель 09, 2010, 23:51 »

Пятница, вечер, торможу....
Есть фоновый процесс общающийся с главным через сигналы. Главный процесс обычно пихает в очередь кучку запросов, а потом рисует GUI, изредка отвлекаясь на отрисовку ответов от фонового процесса. Все замечательно и чудесно.
А тут понадобилось послать несколько запросов подряд и обязательно дожидаться от них ответов...
Теперь вот сижу и думаю, как можно временно сменить асинхронную работу на синхронную если получение ответа идет через сигналы? Мне ж в любом случае надо заводить получателя? В общем получилась вот такая цепочка:
Код:
void A::main_sub() {
   connect(server, SIGNAL(results()), this, SLOT(firstResponse());
   server->request("first request");
}
void A::firstResponse() {
   disconnect(server, SIGNAL(results()), this, 0);
   connect(server, SIGNAL(results()), this, SLOT(secondResponse());
   server->request("second request");
}
void A::secondResponse() {
   disconnect(server, SIGNAL(results()), this, 0);
   connect(server, SIGNAL(results()), this, SLOT(thirdResponse());
   server->request("third request");
}
void A::thirdResponse() {
   disconnect(server, SIGNAL(results()), this, 0);
   connect(server, SIGNAL(results()), this, SLOT(normalResponseToUsersRequest());
}
Вроде работает, но как-то это все излишне кучеряво. Есть решения попроще, не требующие копи-паста?
Записан
garryHotDog
Гость
« Ответ #1 : Апрель 10, 2010, 07:57 »

если все работает- не трать время на поиск "красивого" решения (это мое личное мнение)
Записан
BRE
Гость
« Ответ #2 : Апрель 10, 2010, 08:16 »

Код
C++ (Qt)
void A::func()
{
QEventLoop loop;
 
connect( server, SIGNAL( results() ), &loop, SLOT( quit() ) );
 
server->request( "first request" );
loop.exec();
// обработали результат first request
 
server->request( "second request" );
loop.exec();
// обработали результат second request
 
...
}
 
Записан
SABROG
Гость
« Ответ #3 : Апрель 11, 2010, 09:50 »

Через state machine было бы красивее. Чем то напоминает Traffic Light Example.
« Последнее редактирование: Апрель 11, 2010, 10:02 от SABROG » Записан
White Owl
Гость
« Ответ #4 : Апрель 12, 2010, 18:29 »

BRE,
Спасибо.
То что нужно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.123 секунд. Запросов: 21.