Привет всем,
Никак не можем определиться, как оно правильнее...
Существовал процесс обработку которого можно выразить следующим образом:
Worker::toDo(Args args, Destination* dest)
{
Result result = hardWork(args);
dest->process(result);
}
Развитие системы приводит к тому, что hardWork необходимо вынести в отдельный поток с асинхронным доступом посредством Qt'шных signal-slot'ов.
Получившийся код можно переформулировать следующим образом:
Worker::toDo(Args args, Destination* dest)
{
emit askToDo(args, dest);
}
Worker::onResult(Result result, Destination* dest)
{
dest->process(result);
}
HardWorker::hardWork(Args args, Destination* dest)
{
Result result = realHardWork(args);
emit resultReady(result, dest);
}
connect(Worker::askToDo, HardWorker::HardWork);
connect(HardWorker::resultReady, Worker::onResult);
Где hardWork выполняется в отдельном потоке и установлены следующие связи askToDo -> hardWork, resultReady -> onResult
Необходимость проброса указателя dest в поток получатель вызывает многочисленные сомнения.
Теперь внимание, вопрос !!!
Насколько оправданно будет введение дополнительного отображения int-Destination для устранения такого проброса:
Worker::toDo(Args args, Destination* dest)
{
int id = nextId();
dests[id] = dest
emit askToDo(args, id);
}
Worker::onResult(Result result, int id)
{
Destination* dest = dests[id];
dests.remove(id);
dest->process(result);
}
HardWorker::hardWork(Args args,int id)
{
Result result = reakHardWork(args);
emit resultReady(result, id);
}
connect(Worker::askToDo, HardWorker::HardWork);
connect(HardWorker::resultReady, Worker::onResult);
PS. Извиняюсь за псевдокод