Разработка класса передатчика на C ++: буферизация данных с сервера и отправка клиенту - PullRequest
2 голосов
/ 06 января 2011

Я пишу класс "Tmt", который действует между сервером и клиентами через сокеты. Мой класс Tmt будет получать данные с сервера, создавать внутреннюю очередь и выполнять некоторые операции с данными в очереди, прежде чем они станут доступны клиенту.

Я уже настроил сокетное соединение и могу позвонить
receiverData (); // получить данные с сервера

Клиент будет использовать мой класс Tmt следующим образом:
Tmt mytmt = new Tmt ();
mymt.getProcessedData (); // чтобы получить один кадр.

Мой вопрос состоит в том, как позволить классу Tmt продолжать получать данные с сервера в фоновом режиме после его создания и добавлять их в очередь. У меня есть некоторый опыт в многопоточности в C, но я не уверен, как эта концепция «работы в фоновом режиме» будет реализована в классе в C ++. Пожалуйста, совет, спасибо!

Ответы [ 2 ]

0 голосов
/ 06 января 2011

ИМХО, многопоточность - не лучшее решение для такого рода классов.

Введение фоновых потоков может вызвать много проблем, вы должны по крайней мере разработать средства защиты от создания нескольких ненужных потоков.Также потоки нуждаются в явной инициализации и очистке.Например, обычная очистка потока включает в себя операцию объединения потоков (ожидание остановки потока), которая может привести к взаимоблокировкам, утечкам ресурсов, безответственным пользовательским интерфейсам и т. Д.

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

Позвольте мне нарисовать пример кода об этом:

class Tmt {
...
public:
    ...
    bool doProcessing()
    {
        receiverData();
        // process data
        // return true if data available
    }

    T getProcessedData()
    {
        // return processed data
    }
}

Пользователи класса Tmt должны запустить цикл, выполняя вызов doProcessing, getProcessedData.

Tmt myTmt;
...
while (needMoreData)
{
    if (myTmt.doProcessing())
    {
        myTmt.getProcessedData();
        ...
    }
}

Если пользователи Tmt хотят фоновую обработку, ониможет легко создать другой поток и делать там работу Tmt.На этот раз работы по управлению потоками выполняются пользователями Tmt.

Если пользователи Tmt предпочитают однопотоковый подход, они могут сделать это без каких-либо проблем.

Также отмечено, что известная библиотека curl использует этот вид дизайна.

0 голосов
/ 06 января 2011

Один из вариантов - связать поток с каждым экземпляром класса (возможно, создав поток в конструкторе). Этот поток непрерывно считывает данные из сети и добавляет данные в очередь по мере их доступности. Если поток помечен как частный (то есть клиенты класса не знают о его существовании), то он, по сути, будет работать «в фоновом режиме» без явного вмешательства. Управлять своим состоянием может только объект Tmt.

Что касается реальных реализаций потоков в C ++, вы можете просто отлично использовать Good ol 'Pthreads в C ++. Однако гораздо лучшим подходом, вероятно, было бы использование библиотеки потоков Boost , которая инкапсулирует все состояние потока в свой собственный класс. Они также предлагают целый ряд примитивов синхронизации, которые аналогичны версиям pthread, но существенно проще в использовании.

Надеюсь, это поможет!

Кстати - я бы рекомендовал просто назвать класс Transmit. Нет причин быть слишком кратким. ; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...