Об идентификации объектов
От: Anchor  
Дата: 25.12.09 12:02
Оценка:
Привет всем,

Никак не можем определиться, как оно правильнее...
Существовал процесс обработку которого можно выразить следующим образом:
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. Извиняюсь за псевдокод
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.