Russian Qt Forum

Qt => Общие вопросы => Тема начата: White Owl от Апрель 09, 2010, 23:51



Название: Смена получателя сигнала
Отправлено: 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());
}
Вроде работает, но как-то это все излишне кучеряво. Есть решения попроще, не требующие копи-паста?


Название: Re: Смена получателя сигнала
Отправлено: garryHotDog от Апрель 10, 2010, 07:57
если все работает- не трать время на поиск "красивого" решения (это мое личное мнение)


Название: Re: Смена получателя сигнала
Отправлено: BRE от Апрель 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
 
...
}
 


Название: Re: Смена получателя сигнала
Отправлено: SABROG от Апрель 11, 2010, 09:50
Через state machine было бы красивее. Чем то напоминает Traffic Light Example.


Название: Re: Смена получателя сигнала
Отправлено: White Owl от Апрель 12, 2010, 18:29
BRE,
Спасибо.
То что нужно.