2009-04-18 4 views
1

Im новое для сетевого программирования и, в частности, для асинхронных процессов. Начать также новый с boost-libДля программирования сети boost-asio наилучший подход для обработки ответа?

Внедрение класса для доступа к imap-серверу. Я могу отправить и получить команды , и ответ, вообще

Ответ поставлен в очередь в dequeue внутри класса. Я положил строки ответа в очередь, для дальнейшей обработки.

Каков наилучший способ обработки очереди?

  1. Дополнительный поток для проверки (по времени) очереди, для новых записей?
  2. Каждый раз, когда новые записи помещаются в очередь, происходит обратный вызов?
    Как я могу реализовать и интегрировать этот обратный вызов?

Возможно, у кого-то есть короткий пример.

Благодаря

ответ

1

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

Предполагаете, что вы работаете с синхронным соединением с одним потоком.

ли что-то подобное:

class worker { 

    deque<message> messages; 
    bool is_writing_; 

    push_message(message msg) { 
     messages.push_back(msg); 
     notify(); 
    } 

    void notify() 
    { 
     if(!is_writing_) { 
      is_writing_=true; 
      init(); 
     } 
    } 

    void init() 
    { 
     if(messages.empty()) { is_writing_=false; return; } 
     messamge msg=messages.pop(); 
     convert_to_vector(v); 
     async_write(socket,buffer(v), 
      boost::bind(&worker::complete,this,placehoders::error)); 
    } 
    void complete(error_code const &e) 
    { 
     if(!e) { 
      init(); 
     } 
     else { cleanup(); } 
    } 

}; 

Примечание !!!

Это реализация одного потока.Если вы хотите уведомить от другого потока, вы должны не называть some_worker->push_message(msg), вы должны использовать iosrvice:

service.post(boost::bind(&worker::push_message,some_worker,msg)); 

И push_message будет вызван из того же потока, который проходит ioservice.

+0

Соединение self is asynchron, и рабочий, я думаю, должен быть в другом потоке, поэтому я даю вам пример, чтобы посмотреть, как далеко я нахожусь. У меня ошибка в моем мышлении о том, как я должен начать. Теперь его немного более понятно, поместите ответ в новый объект, который выполняет эту работу. Я положил его только в очередь спасибо –

+0

Я предлагаю взглянуть на примеры и попытаться реализовать несколько простых кликеров/серверов TCP/IP, чтобы понять, как работает материал, а затем попробовать делать реальные вещи. Я должен отметить, что «рабочий» может ввести в заблуждение - он больше похож на объект, который содержит сокет и делает все tcp/ip над ним. – Artyom

1

Одним из возможных путей реализации процессора очереди является использование сигнализации семафора.

Например условия типа нитей (description), если вы находитесь на совместимой платформе POSIX.

У вас может быть N число «потоков обработки очереди», ожидающих в фоновом режиме.

  1. Каждый раз, когда что-то запихивается в очередь, ваш семафор посылает сигнал.

    • Сигнал получен путем спящих потоков обработки очереди, которые начинают обработку очереди, поскольку они знают, что у них есть данные.

    • Когда поток завершает обработку своих данных, проверьте размер очереди, чтобы увидеть, нужно ли ему захватить что-то еще, если нет, то вернитесь к ожиданию сигнала.